First thing you'll need to do is set up a route that ensures anything for /products/category-name gets routed to the correct template. You can do this from the control panel or via craft/config/routes.php
If you do this in your routes.php file you'd need something like this:
return array(
'products/(.*?)' => 'products/index',
);
Which is telling Craft that for any url that contains products/any-characters it should use the products/index template.
Then, on that template, grab the segment that is the category slug
{% set catSegment = craft.request.segment(2) %}
You'll then need to get the category that has that slug
{% set category = craft.categories.slug(catSegment).first() %}
You then have a category model you can work with and can use a craft entries tag with a category criteria using
{% set products = craft.entries.relatedTo(category).find() %}
Loop through products to output your products.
Using this mark-up on the menu.
{% for category in craft.categories.group('products').level(1).all() %} {{ category.title }} {% endfor %}
– MGX Jul 11 '18 at 15:30?category=
Is this (another) problem with Craft 3?
– MGX Jul 12 '18 at 10:21