The PayPal site is improving, as is their service, but there are still a lot of things that aren’t made clear.
When does the buyer need a PayPal account?
A recently cleared up confusion I had was over whether a buyer had to have a PayPal account or not. For a while, I thought it was only Website Payment Pro (WPP) accounts that could take payments without the buyer having to have a PayPal account but as James recently pointed out on the bookwhen help pages, it’s simpler than that:
PayPal Business accounts (Standard & Pro) can accept payments without the buyer having a PayPal account. The buyer has to spot the tiny continue link however.
PayPal Personal accounts cannot. The buyer will see ‘Sign up for a PayPal account and continue checkout’ where the card logos and continue link normally are.
Can I use Maestro with Recurring Payments?
Another issue I had recently was with the new MasterCard Compliance rules making it compulsory to use 3D Secure when taking Maestro/Switch/Solo payments. This has unfortunately made it impossible to take a PayPal Pro Recurring Payment using these card types. PayPal help desk confirmed this. The WPP integration guide (pdf link) Chapter 15 page 122 confirms this:
3-D Secure is not supported for direct Recurring Billing and Reference Transactions. Cards that require 3-D Secure authentication cannot use these APIs; however, cards where 3-D Secure is optional can continue to process transactions without authentication. If you use either of these features in your current integration, you must exclude the Maestro card type from the available options.
Maestro and Solo are the same.

Kaizen
I just read a TechCrunch post with some useful tips worth reiterating. The main lesson to be learnt is that a web startup, unless it is truly innovative or receives funding, should simply be software that solves a specific problem. There’s no magic! That’s how to ‘bootstrap your startup’.
Pick a market (the closer to it you are the better), make a product that’s useful, and people will pay for. Make the product the best there is out there. And then stick to it. Love it. Make it slicker, simpler, and easier. Don’t keep adding to it, making it bigger and uglier! Kaizen.
TidyApps (as a business) is almost a year old now. Continuous learning is the key. Reading blogs, tips, and books is vital but there’s no substitute for learning from doing. And doing is king.
A quick answer to a problem that’s not obvious but is easy to solve.
If users occasionally get a 422 error (usually when trying to logon) saying:
The change you wanted was rejected.
Maybe you tried to change something you didn’t have access to.
The server error is:
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken)
/public/422.html (422 Unprocessable Entity)
It’s because the user has disabled cookies! It’s up to you to catch and deal with it better.
Processing SessionsController#create (for 163.1.180.9 at 2009-07-31 14:23:25) [POST]
Parameters: {"commit"=>"Sign in", "action"=>"create", "authenticity_token"=>"z8VBO3J6AgbgzrwAYTc/ZLAQIf6zwnATa3GfI8xTUEw=", "to"=>"", "controller"=>"sessions", "password"=>"[FILTERED]", "email"=>"", "remember_me"=>"1"}
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
passenger (2.2.4) lib/phusion_passenger/rack/request_handler.rb:91:in `process_request'
passenger (2.2.4) lib/phusion_passenger/abstract_request_handler.rb:206:in `main_loop'
passenger (2.2.4) lib/phusion_passenger/railz/application_spawner.rb:376:in `start_request_handler'
passenger (2.2.4) lib/phusion_passenger/railz/application_spawner.rb:334:in `handle_spawn_application'
passenger (2.2.4) lib/phusion_passenger/utils.rb:182:in `safe_fork'
passenger (2.2.4) lib/phusion_passenger/railz/application_spawner.rb:332:in `handle_spawn_application'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:351:in `__send__'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:351:in `main_loop'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:195:in `start_synchronously'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:162:in `start'
passenger (2.2.4) lib/phusion_passenger/railz/application_spawner.rb:213:in `start'
passenger (2.2.4) lib/phusion_passenger/spawn_manager.rb:261:in `spawn_rails_application'
passenger (2.2.4) lib/phusion_passenger/abstract_server_collection.rb:126:in `lookup_or_add'
passenger (2.2.4) lib/phusion_passenger/spawn_manager.rb:255:in `spawn_rails_application'
passenger (2.2.4) lib/phusion_passenger/abstract_server_collection.rb:80:in `synchronize'
passenger (2.2.4) lib/phusion_passenger/abstract_server_collection.rb:79:in `synchronize'
passenger (2.2.4) lib/phusion_passenger/spawn_manager.rb:254:in `spawn_rails_application'
passenger (2.2.4) lib/phusion_passenger/spawn_manager.rb:153:in `spawn_application'
passenger (2.2.4) lib/phusion_passenger/spawn_manager.rb:286:in `handle_spawn_application'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:351:in `__send__'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:351:in `main_loop'
passenger (2.2.4) lib/phusion_passenger/abstract_server.rb:195:in `start_synchronously'
Rendering /public/422.html (422 Unprocessable Entity)
Hope that helps someone.