diff --git a/cj-token.cabal b/cj-token.cabal
--- a/cj-token.cabal
+++ b/cj-token.cabal
@@ -3,7 +3,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           cj-token
-version:        0.0.0
+version:        0.0.1
 synopsis:       A new Haskeleton package.
 description:    cj-token is a new Haskeleton package.
 category:       Other
diff --git a/library/CJ/Auth/Token.hs b/library/CJ/Auth/Token.hs
--- a/library/CJ/Auth/Token.hs
+++ b/library/CJ/Auth/Token.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE OverloadedStrings #-}
+
 module CJ.Auth.Token
   ( UserBearerToken(..)
   , JSONToken(..)
@@ -35,13 +36,13 @@
   fromClaims :: JWTClaimsSet -> Maybe a
 
 data UserBearerToken = UserBearerToken
-  { _bearerUserId :: T.Text
+  { _bearerUserId :: Maybe T.Text
   , _bearerAppId :: T.Text
   } deriving (Eq, Show)
 
 instance JSONToken UserBearerToken where
-  toClaims UserBearerToken{ _bearerUserId = uid, _bearerAppId = aid } =
-    def { unregisteredClaims = M.fromList [ ("userId", toJSON uid)
+  toClaims UserBearerToken{ _bearerUserId = maybeUid, _bearerAppId = aid } =
+    def { unregisteredClaims = M.fromList [ ("userId", toJSON maybeUid)
                                           , ("appId",  toJSON aid) ] }
 
   fromClaims JWTClaimsSet{ unregisteredClaims = clms } =
@@ -49,7 +50,6 @@
     where uid = fromValue =<< M.lookup "userId" clms
           aid = fromValue =<< M.lookup "appId"  clms
 
-
 fromValue :: FromJSON a => Value -> Maybe a
 fromValue = parseMaybe parseJSON
 
@@ -64,6 +64,7 @@
   where
     verifyUtf8Base64 base64Str = rightToMaybe $ TE.decodeUtf8' (BS64.decodeLenient $ TE.encodeUtf8 base64Str)
 
+-- move this out of interface?
 encodeToken :: (JSONToken a) => Secret -> a -> POSIXTime -> T.Text
 encodeToken secret token expTime = encodeJWT secret expiringClaims
   where baseClaims = toClaims token
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: cj-token
-version: 0.0.0
+version: 0.0.1
 category: Other
 synopsis: A new Haskeleton package.
 description: cj-token is a new Haskeleton package.
diff --git a/test-suite/CJ/Auth/TokenSpec.hs b/test-suite/CJ/Auth/TokenSpec.hs
--- a/test-suite/CJ/Auth/TokenSpec.hs
+++ b/test-suite/CJ/Auth/TokenSpec.hs
@@ -10,6 +10,8 @@
 
 import qualified Web.JWT as JWT
 import qualified Data.Text as T
+
+import Data.Maybe (isNothing)
 import Data.String (fromString)
 import CJ.Auth.Token
 
@@ -23,12 +25,33 @@
       it "decode . encode = id" $
         property $ \x y ->
           let token = UserBearerToken{ _bearerUserId = x
-                                 , _bearerAppId  = y }
+                                     , _bearerAppId  = y }
               secret = JWT.secret ""
               encoded = encodeToken secret token 100
               decoded = decodeToken secret encoded 0
           in decoded == Just token
 
+    describe "claims" $ do
+      it "token contains user id if exists" $
+        property $ \uid aid ->
+          let token = UserBearerToken{ _bearerUserId = uid
+                                     , _bearerAppId  = aid }
+              secret = JWT.secret ""
+              encoded = encodeToken secret token 100
+              decoded = decodeToken secret encoded 0
+              (Just UserBearerToken{ _bearerUserId = decodedUid }) = decoded
+          in uid == decodedUid
+
+      it "token does not contain user id if does not exist" $
+        property $ \aid ->
+          let token = UserBearerToken{ _bearerUserId = Nothing
+                                     , _bearerAppId  = aid }
+              secret = JWT.secret ""
+              encoded = encodeToken secret token 100
+              decoded = decodeToken secret encoded 0
+              (Just UserBearerToken{ _bearerUserId = decodedUid }) = decoded
+          in isNothing decodedUid
+
     describe "decodeToken" $
       it "returns Nothing if the token is expired" $
         property $ \x y ->
@@ -38,7 +61,6 @@
               encoded = encodeToken secret token time
               decoded = decodeToken secret encoded 100 :: (Maybe UserBearerToken)
           in decoded `shouldBe` Nothing
-
 
   describe "decodeToken" $
     it "returns Nothing if token is garbage" $ do
