milestones
One-shot rewards at TOTAL / MONTHLY / WEEKLY / DAILY / STREAK thresholds.
Milestones are one-shot rewards that fire the first time a player crosses a threshold on a particular counter. They're the long-term chase that keeps players coming back well after the daily reward has lost its novelty.

The milestones GUI, players can browse every tier, see their progress, and preview the reward at each step.
Quick example
milestones:
enabled: true
tiers:
- id: first-vote
counter: TOTAL
threshold: 1
message: "<#4DA6E8>Welcome aboard! Your first vote unlocks the Voter tag.</>"
rewards:
- type: command
value: "lp user %player% parent add voter"
- id: ten-votes
counter: TOTAL
threshold: 10
message: "<#38D9F0>10 votes! Here's a small thank-you.</>"
rewards:
- type: money
amount: 1000
- id: streak-7
counter: STREAK
threshold: 7
message: "<#FF9D5E>7-day streak! You're committed.</>"
rewards:
- type: item
material: DIAMOND
amount: 5
name: "<#FFD700>Streak Diamonds</>"
- id: monthly-30
counter: MONTHLY
threshold: 30
message: "<#A8D8F0>30 votes this month, top voter material.</>"
rewards:
- type: command
value: "give %player% netherite_ingot 1"Counter kinds
Each milestone tier picks one counter to watch. The plugin checks that counter on every vote and fires the milestone once when the threshold is crossed.
| Counter | What it tracks | Resets? |
|---|---|---|
TOTAL | All-time vote count for this player | Never |
MONTHLY | Votes this calendar month | First of the month |
WEEKLY | Votes this week | Monday 00:00 server-local |
DAILY | Votes today | 00:00 server-local |
STREAK | Consecutive days the player has voted at least once | If the player misses a day |
TOTAL and STREAK milestones are the most common, they're
genuinely long-term goals. MONTHLY / WEEKLY / DAILY milestones
fire repeatedly across periods (once per period, not once ever),
which makes them more like "achievements within a period."
Reference
| Key | Type | Default | Notes |
|---|---|---|---|
enabled | boolean | true | Master switch for milestones. |
tiers | list | Ordered list of milestone definitions. | |
<tier>.id | string | Internal id, must be unique. Used in the database for dedup. | |
<tier>.counter | string | One of TOTAL, MONTHLY, WEEKLY, DAILY, STREAK. | |
<tier>.threshold | int | The counter value the player must reach (or exceed). | |
<tier>.message | string | MiniMessage line sent when the milestone fires. | |
<tier>.rewards | list | The reward pool to fire, same shape as vote-rewards.yml. |
Repeating milestones
Set repeat: true on a tier to make it re-trigger every threshold
votes instead of once at exactly N. Useful for "every 100 votes get
a goodie" patterns:
- id: every-100
counter: TOTAL
threshold: 100
repeat: true
message: "<#A8D8F0>Another 100 votes! Here's another bonus.</>"
rewards:
- type: money
amount: 5000STREAK milestones with repeat: true are particularly powerful -
"every 7 days of voting straight, get a chest of loot" gives players
a recurring weekly chase that doesn't reset their progress.
Resetting a player's milestone state
Milestone state is permanent by design, it's what makes a milestone a
milestone. If you genuinely need to clear it (e.g. after a wipe), use
/voteplus reset <player>, which clears every counter and milestone
mark for that player in one command.