A Ring handler takes in a request map, and returns a response map. Compojure routes are essentially Ring handlers, with one addition: if they return nil, Compojure considers the route to have failed, and moves onto the next route.
The println function returns nil, so when it is the last function called, your create-product function returns nil, telling Compojure the POST route didn't match. This will likely result the request cascading down to your final not-found route, and your application returns a 404.
The return value from a commute is the value the ref is set to, which judging by the "conj" is not a map. This is why you're getting an error; because you're returning your "products" data structure, when Ring expects a response map.
- James