Never store serialised objects, accessing them is slow (retrieval, unserializing) and searching is even harder.
If it's a relateively small number of tasks and they are boolean you could store them as bit masks (that may be the wrong term).
1 = first_login
2 = profile_complete
4 = other_thing_complete
8 = other_thing2_complete
16 = other_thing3_complete
...
Then the value 10 means profile_complete+other_thing2_complete.
See http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html or searching these.
mysql> select 10&2;
+------+
| 10&2 |
+------+
| 2 |
+------+
1 row in set (0.00 sec)
mysql> select 10&8;
+------+
| 10&8 |
+------+
| 8 |
+------+
1 row in set (0.01 sec)
mysql> select 10&1;
+------+
| 10&1 |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
mysql> select 10&4;
+------+
| 10&4 |
+------+
| 0 |
+------+
1 row in set (0.00 sec)
mysql> select 10&16;
+-------+
| 10&16 |
+-------+
| 0 |
+-------+
1 row in set (0.00 sec)
As you can see only the first two queries returned a non-zero value, meaning that if you search for records where the field anded with 8 is non-zero you get all records where other_thing2_complete is complete etc. To set other_thing2_complete to true you simply add 8. To set other_thing2_complete to false you simply subtract 8.
Never done this myself, so you may run into problems I've not foreseen. But if all the activities you are keeping track of are boolean, then this should do the trick and allow for the best searching/updating.