Ledger field reference
Every time a rule matches, Novigem creates a Ledger Entry record. These entries are the source of truth for points, leaderboard rankings, and challenge progress. They cannot be edited or deleted.
Not every entry comes from a rule. Novigem also writes ledger entries for challenge completion bonuses and for streak milestone bonuses. Those are written by the platform itself, so they have no Rule and no source record.
Entry fields
| Field | API name | Type | Description |
|---|---|---|---|
| User | User__c | Lookup (User) | The user who earned the points. Set by the rule’s Actor Mode. |
| Rule | Rule__c | Lookup (Rule__c) | The rule that fired. Blank on completion bonus and streak milestone entries, which Novigem writes without a rule. |
| Challenge | Challenge__c | Lookup (Challenge__c) | The challenge this entry contributes toward. Blank if the rule is not linked to a challenge. |
| Source Record Id | Source_Record_Id__c | Text | The ID of the Salesforce record that triggered the rule (the Opportunity, Task, etc.). Blank on completion bonus and streak milestone entries, which have no triggering record. |
| Source Object | Source_Object__c | Text | The API name of the object that triggered the rule, for example Opportunity or Site_Visit__c. Blank on completion bonus and streak milestone entries. |
| Points | Points__c | Number | Points awarded. Matches the value set on the rule, or the bonus amount on completion and streak entries. |
| Dedup Identifier | Dedup_Identifier__c | Text (Unique) | Prevents duplicate awards. See below. |
| Occurred Date Time | Occurred_Date_Time__c | DateTime | When the award happened. |
| Created Date | CreatedDate | DateTime | Standard Salesforce created date. |
Deduplication
Every entry has a unique Dedup Identifier built from:
{userId}_{challengeId}_{ruleId}_{sourceRecordId}If no challenge is linked, the challenge portion is GENERAL. If no source record is available (for example, a manual adjustment), a timestamp is used instead.
Streak milestone bonuses use a different key shape, because there is no rule and no record to key on:
STREAK-MILESTONE|{userId}|{streakRunStart}|{milestone}The run start date and the milestone together mean a rep can earn the same milestone again on a later streak run, but never twice within one run.
When the engine processes a batch, it first queries for any existing entries with the same dedup keys, filters them out, and then inserts. A DUPLICATE_VALUE database exception is caught as a second safety net.
The result: the same user triggering the same rule on the same record will only ever earn points once, no matter how many times the record is saved.
Deduplication is automatic. No configuration needed.
Immutability
Ledger entries cannot be edited or deleted through normal usage. If scoring needs to be corrected, adjust the rule going forward. Past entries stay as-is.
This is intentional. The ledger is an audit trail: consistent and trustworthy.
Reporting
Ledger entries are standard Salesforce records, so you can build reports with the built-in reporting tools:
- Points by user: group by
User__c, sumPoints__c - Points by challenge: group by
Challenge__c, sumPoints__c - Activity over time: group by
Occurred_Date_Time__cweekly or monthly - Which rules fire most: group by
Rule__c, count entries
Building a report that combines ledger data with pipeline metrics is a good way to show the correlation between Novigem activity and business outcomes.
Coaching signals read the ledger
Coaching signals are derived from ledger history. The nightly job compares each rep’s recent entries against their own past entries using fixed thresholds, then writes what it finds to Performance_Signal__c.
A rep with no ledger entries produces no signals. That is the usual explanation for an empty coaching feed or a blank row in Team Pulse: nothing has been awarded to that user yet, so there is no history to compare against.
See also
- Core concepts: Ledger
- Rules field reference: how rules create ledger entries
- Challenges field reference: how challenges use ledger data for progress
- Troubleshooting