How do I make the zero values show up in count?
The thing is you are doing all pruning on Mobile or Desktop or both, you haven't add any condition for other than this values.
What I have done is other than this 3 Mobile or Desktop or both values in table, it will count the row &amp; calculate amount if present.
with 
mobile_users as (select distinct user_id 
                 from spending 
                 where platform = 'mobile'),
desktop_users as (select distinct user_id 
                  from spending 
                  where platform = 'desktop')
(select spend_date, platform, count(user_id) as total_users, sum(amount) as total_amount 
 from spending
 where user_id not in (select user_id 
                       from mobile_users)
 group by spend_date)
union all
(select spend_date, platform, count(user_id) as total_users, sum(amount) as total_amount 
 from spending
 where user_id not in (select user_id 
                       from desktop_users)
 group by spend_date)
union all
(select spend_date, 'both' as platform, count(user_id) as total_users, sum(amount) as total_amount 
 from spending
 where user_id in (select user_id from 
                   desktop_users) 
   and user_id in (select user_id 
                   from mobile_users)
 group by spend_date)
 union all 
(
  /* here the code begins */
select spend_date,  platform, count(user_id) as total_users, sum(amount) as total_amount 
 from spending
 where user_id not in (select user_id from 
                   desktop_users) 
   and user_id not in (select user_id 
                   from mobile_users)
 group by spend_date
)
order by spend_date