Using Logseq to manage Christmas gift buying, wrapping, giving, etc

tl;dr: Track your gifts in Logseq so you can remember what you’ve gotten people the next time you have to shop for them. Also so you don’t lose track of all the Christmas gifts and such.


The past few years, I used Airtable to keep track of the workload of ordering, receiving, wrapping, organizing, and giving Christmas gifts for our immediate and extended family. This worked ok, but my husband wasn’t all that interested in logging into Airtable, so my data was incomplete. Also, I only use that database for Christmas gifts, so I would forget about it entirely until it was time to start the whole process again.

Earlier this year, I made a [[Gift]] template to track all the birthday gifts I was needing to buy for friends and family. It quickly became useful, because I could use Logseq search to see what gifts had been given to each person.

Then it came time for Christmas gifts. The [[Gift]] template became even more useful, because of the sheer number of gifts that needed to be managed all at once. Add to that, my husband and I share a Logseq graph, and he was much more willing to interact with the data in Logseq than he was in Airtable.

Here’s the template:

[[Gift]]
description:: 
link::
for:: (link to the person page the gift is intended for)
from:: (useful for things like gifts from one kid to another, which I sometimes need to track) 
cost::
store:: 
status:: (#ordered, #received, #wrapped, #gifted)
tags:: #[[2023 Christmas]]
template:: Gift Template

Every time I would order a gift for someone, I would make a record of it in the journal page for that day. Then on my management page for this Christmas season, I added a bunch of queries so that I could view the gifts bought for each person, the total spent for each person, and all of the gifts in a particular status.

This query showed all the gifts that had been ordered but not received yet:

{{query (and [[Gift]] (property status #ordered ) (not [[Templates]]) (not (page [[Gift]])) (not (page [[2023 Christmas]] )) [[2023 Christmas]] )}}

I had a bunch of other queries, one for each person that we were buying gifts for:

{{query (and [[Gift]] (property for #Joe  )  (not [[Templates]]) (not (page [[Gift]])) (not (page [[2023 Christmas]] )) [[2023 Christmas]] )}}

Nested under the individual person queries, I added a table function to total the cost of the gifts for that person.

Total cost:: {{function (sum :cost)}}

Overall, this worked pretty well.

  • Since each person is linked in the gift template, when I view their page, I could see all the gifts we’d bought them. This worked better for people outside of our immediate family, who had fewer entries on their pages than the immediate family members who get tagged a lot in my graph.
  • Since this information is stored in Logseq, where I spend a lot of time anyway, it’s more accessible than if I had to remember that I had that data stored in an Airtable database.
  • Since my husband is willing to update things, the data is more accurate.

There are a few downsides:

  • I don’t love the copy/paste nature of all the different queries I had for each person. If I decided to make updates, I needed to go back through and modify each one.
  • Tracking joint gifts was a little complicated, because tagging a gift with two recipients made it look as if we were spending that money twice (once in each individual’s gift report)
  • I got some weird blank results if a [[Gift]] record had a child node. I solved this by putting that information into the notes field rather than a child node.