We usually start Christmas shopping as soon as Christmas is over the year before, and try to have at least 95% of it done by the end of November. The only reason we wait that long is because we tend to do a lot of Black Friday and Cyber Monday shopping.
This year I'm having more trouble keeping things secret from Elliott. He's an excellent reader and speller (he tests about 4 grade levels ahead in reading right now), so if he can FIND a list, he can definitely read it. Plus with all the remodeling in the basement, we've temporarily lost 2 of our hiding spots. Add to that the fact that he now knows how to see what we've ordered on Amazon (my husband showed him, so he could see if he had already bought a game for the Kindle Fire), and we are having trouble this year.
One thing that we've done to keep secrets is order it through another website, with other things for him. This works right now because we are always gone on Saturdays, so my sister is the one that checks the mail most of the time, and during the week it comes while he's in school. If we order other stuff for him, the box that says Kohl's or wherever on the side doesn't arouse suspicion. :) And it's already open when he gets home, so he doesn't see anything that comes out of the box!
Another thing we've done is order books through Scholastic. We ended up ordering through my sister last month, and then my mom mailed them up here (which once again is no big deal, because packages from Nama frequently come anyway). His teacher did send a note home telling us to just let her know if we wanted to keep anything that we order a secret from them, though, because she could keep them until we arranged a time to pick them up, closer to Christmas or birthdays. If we order any more books we want to keep a secret, we will probably go that route.
We don't keep everything a secret, though. We don't see any big deal with him knowing already that he's getting certain Super Hero toys, or a specific Lego set.