> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getkardy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Improve your programme

> Use member progress, reward claims and referrals to choose your next improvement.

export const GuidePractice = ({questions}) => {
  const [step, setStep] = useState(0);
  const [answer, setAnswer] = useState(null);
  const question = questions[step];
  const correct = answer === question.correct;
  return <section className="kardy-guide kardy-guide-practice" aria-label="Practice a real situation">
      <div className="kardy-guide-heading">
        <div>
          <span className="kardy-guide-kicker">TRY IT SAFELY</span>
          <h3>What would you do?</h3>
        </div>
        <span className="kardy-guide-count">
          {step + 1} / {questions.length}
        </span>
      </div>
      <p className="kardy-guide-question">{question.prompt}</p>
      <div className="kardy-guide-answers" role="group" aria-label="Choose an answer">
        {question.options.map((option, index) => <button key={`${step}-${index}`} type="button" aria-pressed={answer === index} onClick={() => setAnswer(index)}>
            <span aria-hidden="true">{String.fromCharCode(65 + index)}</span>
            {option}
          </button>)}
      </div>
      <div role="status" aria-live="polite">
        {answer !== null && <div className="kardy-guide-feedback" data-correct={correct}>
            <strong>{correct ? "That’s right." : "Not quite."}</strong>
            <p>{question.explanation}</p>
          </div>}
      </div>
      <div className="kardy-guide-footer">
        <small>Practice only. No stamps, claims or account changes.</small>
        <button type="button" className="kardy-guide-next" disabled={answer === null} onClick={() => {
    setStep((step + 1) % questions.length);
    setAnswer(null);
  }}>
          {step === questions.length - 1 ? "Practise again" : "Next situation"}
          <span aria-hidden="true"> →</span>
        </button>
      </div>
    </section>;
};

## Turn reports into useful action

## Help members reach their next reward

Open **Members**, search by name, member code, email or phone, and open a member's
details. Check their current stamps, rewards ready and activity history. Search
covers the loaded member list, so check the organisation and loading state if
someone is missing.

* **Not started:** check that the join QR is easy to find and staff explain how a
  qualifying visit earns a stamp. Signing up alone is not a recorded visit.
* **On track:** make the next goal clear at the counter. Review the reward wording
  and whether the team applies the qualifying rules consistently.
* **Goal reached:** check reward availability and redemption outlets, then help
  staff recognise when a member can claim through **Scan**.

These are suggested checks, not automated recommendations. **Rewards ready** counts
one currently eligible reward per membership, not every future claim that excess
stamps could cover. **Power customers** highlights the top three among loaded
members by all-time recorded visits; it is not a spend ranking. See
[member management](/features/members).

## Review reward performance

Open **Rewards** and inspect the **Reward redemptions** graph, then the performance
table. **On track**, **Ready** and **Not started** describe current assigned members;
**Claimed** in that table is all-time history matched to the reward's current name.
Renaming a reward can therefore change that displayed claimed count.

Use **Reward claims → Add filter** to choose a reward and switch **Status** between
**Waiting to be claimed** and **Claimed**. Click a reward name in the performance
table to filter its claims. The graph still covers the whole programme, not that
table selection. Choose **Refresh** for the latest activity.

If many members are ready but few claims are recorded, first check stock,
eligibility, outlet restrictions and staff familiarity with redemption. Do not
assume the reward needs replacing. Before changing a goal or deleting a reward,
review the effect on existing members in [stamps and rewards](/features/rewards).

## Understand referral results

Open **Referrals** to check its **Live** or **Inactive** status and configured
bonuses. Separate friends who joined from successful referrals and those still
awaiting qualification. The graph counts success on the qualification date,
not the signup date.

A signup alone does not qualify. The friend must make the first qualifying visit
and receive an actual staff-issued stamp, with the other eligibility checks met.
If joins are not becoming successful referrals, review the customer instructions
and [qualification rules](/features/referrals) with staff. Do not promise a bonus
just for sharing a link, or infer link views from these counts.

## Review locations without jumping to conclusions

Use **Location performance** to identify the leading outlets for the selected
metric and dates. Only outlet-attributed events contribute. Open **View all
locations** for a wider review, then inspect the relevant outlet's activity.

A quieter outlet may have shorter opening hours, fewer recorded stamps or a less
visible join QR. Check these with its team before judging performance. Membership
progress belongs to the brand, not a separate balance at each outlet. See
[outlet management](/features/outlets).

## Check your understanding

<GuidePractice
  questions={[
{
  prompt:
    "A friend joined through an invite, but no referral bonus appears. What should you check?",
  options: [
    "Whether the first qualifying staff-issued stamp and other eligibility requirements were met",
    "Whether the invite was copied twice",
    "Whether the Owner refreshed billing",
  ],
  correct: 0,
  explanation:
    "Joining alone does not qualify. Review the first actual staff-issued stamp and referral eligibility rules before promising a bonus.",
},
]}
/>

<a className="kardy-guide-index" href="/guides/owner">
  All owner guides <span aria-hidden="true">↗</span>
</a>
