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.