Gamification 0.9.94 / Rewards
Achievements and ranks
Configure versioned achievements, exact progress, and independent rank ladders.
Achievement and rank editors include a WordPress media-library image control. Images are stored as attachment references in each immutable definition version, so an earned achievement or historical rank assignment keeps the artwork that existed when it was granted. Member profiles, ordinary WordPress shortcodes, and the native FluentCommunity and SnapWeb renderers receive responsive image metadata rather than resolving attachments independently.
Discovery and progress are intentionally separate. Achievement catalog lists every published, discoverable achievement and marks those already earned; achievements configured as hidden remain absent until the current member earns them. Rank catalog lists every published rank grouped by its progress-track metadata. Earned-achievement and current-rank views continue to show only the selected member's own state.
Pro achievements support types, draft/published/paused states, repeatability, earning limits, presentation metadata, exact point rewards, and one or more canonical-event requirements. Progress processing is serialized per member and achievement. Revocation reverses associated points rather than deleting history. Provider-driven revocations use the same service and retain provider, event, synchronization-run, direction, authority, adapter, and reason metadata on the grant.
Choose Edit from the Achievement list to revise the complete definition. Saving requires a change note, archives the old definition, and creates the next numbered version. Progress is keyed by achievement version: changing an event, target, increment, or requirement key never reinterprets progress earned under the old definition. If the definition changes while an event is being processed, that event is not applied to the newer version.
Ranks belong to independent ordered rank tracks. Member levels (default) is available immediately and is the only track most sites need. The Add track action beside rank creation adds another only when members need a second simultaneous form of progression, such as Contributor status or Course level. Assigning a new rank closes the previous current assignment in the same track and preserves its history. Existing grants, progress, definitions, and assignments remain readable if Pro expires.
Member-facing surfaces never expose a track's internal slug or provider mapping identifier. If two active tracks intentionally share the same public name, Cointacted adds a stable occurrence number, such as Course level 1 and Course level 2, while administrators remain free to give each track a more descriptive name.
Reward rules can use current ranks or earned achievements to adjust point amounts without duplicating the entire rule. Administrators set a base amount and ordered member rows for a percentage change, exact addition/subtraction, or exact replacement. Only the first matching row applies. Member-definition reads are cached for the current request and the exact base and final amounts are retained in reward audit metadata. Separately, an Achievement definition may still award its own one-time points when it is earned.
Rank edits use the same immutable version history. A rank cannot be moved to a different track after creation because existing assignments retain their original track identity. Each assignment records the exact rank version, so historical names, descriptions, images, and priorities remain reconstructable after later edits.
Provider migrations may safely express a tiered badge as multiple achievement definitions when the provider stores each tier as a distinct milestone. The source mapping retains the provider family and level identity. Only observed earned state is granted; Cointacted does not synthesize unrecorded lower-tier history or timestamps.
GamiPress featured images and myCred badge/rank attachment artwork are retained when the source and destination are the same WordPress installation. Attachment IDs are local to a WordPress media library; an export imported into a different site retains definition metadata but cannot invent or remotely copy a missing media file.
Provider rank migrations use the same independent-ladder and immutable-history model. A provider that exposes exact transition times can retain them. When a provider such as myCred exposes only a current user-meta pointer, the first assignment is explicitly marked as an opening observation rather than being given a fabricated historical promotion time. A later observed rank change closes the former Cointacted assignment and preserves both rows. Provider rank-earning dates are converted once to canonical UTC and then validated without applying the PHP server timezone a second time.
GamiPress exposes both immutable rank-earning rows and current state. Cointacted first imports each earning with its native ID and original time, then reconciles the current pointer independently. Members with no explicit GamiPress pointer retain the provider's implicit lowest published rank as a labelled opening state; it is not misrepresented as a historical earned transition.
