Usually what I do is I have a script that works. I then wrap that script with another script to set things up for cron such as source .profile, redirecting stdout and stderr, logging errors, etc. I keep the entry in the crontab itself very simple and clean. Its just easier to muck with and debug.
Usually folks with issues like this have put something in their .profile that assumes a controlling tty is attached (like stty or something like that). Another thing I have in my .profiles is the ability to turn on tracing so I can see where the .profile loading is dying. Do this with "set -x". I actually have a tree of .profiles so I set a variable in the top one and which does the set -x if it is set.
The shell will not be interactive nor have a controlling tty. This is sorta rare and often confuses something in a user's .profile. The shell is probably "sh" which might have some subtle differences from /bin/ksh although it is not suppose to.
Hope this helps