This turned out to be really easy.
Firstly take the sample code from github
and save it into a file unchanged. In this case i created a folder called IPN and called the file ipn.php

NOTE at this stage i am running through ngrok as the PayPal IPN simulator does not work with localhost. You could simply deploy to Production and use the production URL for the page and test live
I then create an API action and call the php page via an API call
As the IPN call is effectively just a validation/ handshake no inputs or outputs are required; what the call does is return all the required data via PPOST variables. Calling this API call populates these variables.
I create just two for demo purposes.

All the fields which can be used are listed in the PayPal IPN documents
I can then access those POST variables within a database action
so i have a simple table

and a database insert
I then go to the IPN simulator in the PayPal developers site and add the ngrok address pointing to the API action (don’t forget Localhost won’t work!)
Click send

You should see the confirmation at the top of the page
and the data should be added to your database table
Once testing is completed your production web address should be substituted for the ngrok address in the API action and on PayPal
I have not added validation to keep things simple but the IPN returns a field payment_status which returns the state of the transaction

In production this his should be checked immediately after the API call before processing the data returned.
Will post a Node version tomorrow which is even simple by using a custom module