A response of "VERIFIED" does not mean that PayPal has accepted the payment. It just means that whatever was posted to "paychecker.aspx" was indeed sent from PayPal (and not from some user trying to get a free license). For instance PayPal could be sending you a notification that the payment was rejected and it would still be "VERIFIED".

In other words, there's something wrong with your PayPal sandbox that everything is getting posted as Pending rather than Completed. I'd talk to PayPal about this.

I think the payment status="pending" issue is currency related. If I accept payments in USD instead of GBP (i.e. do not use Paypal currency conversion, let the credit card company do it), then the payment status="Complete". I tried this in non-sandbox mode and it works. In sandbox mode I also created a USD user, but it doesn't work for some reason. Who knows

A problem now appearing is that 1 paypal payment is generating multiple keys ( 8 keys over the space of 1 hr!). Currently the Paypal API looks to be too buggy to be honest

Its a pity because Paypal collects UK VAT which is very useful. I can use it in the meantime but without the API

It looks like product keys are being generated correctly. The "Pending" failures from earlier are now being completed by PayPal -- they're just being slow about it. Here's what I would recommend:

Delete the generated product keys.

Cancel any pending payments in PayPal and the sandbox.

Revert the paychecker.aspx.vb file to the one included in the Web API Pack.

Then run a single sandbox payment with the currency & price set to what you want. Set the quantity to something you haven't used before so you can tell that this is a new test. Then wait for it to be completed.