Achievements are badges earned through gameplay. They appear on your profile as a chunky labeled tile grid organized by category, and can be highlighted in Settings. Each achievement shows what percentage of players have earned it.
Profile Display: Achievements display as a category-organized tile grid on your profile. Up to 5 achievements can be highlighted as featured. Visitors and you can expand to view all earned achievements. Locked achievements appear grayed out with their unlock criteria visible.
Settings: Go to Settings → Achievement Highlights to choose which 5 to display. Leave slots empty if you prefer.
Account-Bound: Achievements are tied to your account, not your character. They persist across character retirements. The characterAchievements collection uses userId as the primary FK; characterId is optional and tracks which character earned the achievement.
Rarity: "X% of players" shows how many accounts (with at least one character) have each achievement (NPPs are not counted).
Categories: Achievements are grouped by category (Special, Elections, Legislation, Actions, Social, Milestones, in that display order). This is the AchievementCategory union in : "milestone" | "election" | "legislation" | "social" | "action" | "special". Full definitions live in (58 achievements as of this writing).
awardAchievement/awardAchievements also runs maybeAwardCompletionist after every award, which grants completionist once an account holds every other achievement.
Not every achievement goes through . Several call awardAchievement directly at the point of the game event instead of through a shared trigger function: lawmaker (, ), cosponsor (), donor/big_spender (, ), speaker_candidate (), party_leader (, , , the party leadership appointment route), policy_shift (), first_subscriber (), and presidential_nominee (). Only patreon_supporter_plus, wiki_contributor, party_founder, and dealmaker are seeded manual_only with no automatic award path (admin/moderator grant only, via or ).
Master list of achievement definitions: slug, name, description, icon, category, triggerType, triggerConfig?, isHidden, order, createdAt, updatedAt (see )
characterAchievements
userId, characterId?, achievementId (ObjectId reference to achievements._id), earnedAt, grantedBy?
Note: the join field is achievementId, an ObjectId reference to the achievement's _id, not an achievementSlug string. userId is the primary FK, achievements are account-bound, not character-bound. characterId is stored for historical context (which character earned it). Slug-to-_id lookups go through getAchievementBySlug in .