> ## 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.

# Owner guide

> Launch your organisation, give teammates the right access, and oversee your loyalty programme.

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>;
};

export const GuideChecklist = ({guide, title, items}) => {
  const [checked, setChecked] = useState([]);
  const [storage, setStorage] = useState("Progress stays in this browser only.");
  useEffect(() => {
    try {
      const value = JSON.parse(localStorage.getItem(`kardy-guide-v1:${guide}`) || "[]");
      setChecked(Array.isArray(value) ? [...new Set(value.filter(i => Number.isInteger(i) && i >= 0 && i < items.length))] : []);
    } catch {
      setStorage("Browser storage is unavailable. Progress lasts until you leave this page.");
    }
  }, [guide, items.length]);
  const save = next => {
    setChecked(next);
    try {
      localStorage.setItem(`kardy-guide-v1:${guide}`, JSON.stringify(next));
    } catch {
      setStorage("Browser storage is unavailable. Progress lasts until you leave this page.");
    }
  };
  return <section className="kardy-guide" aria-label={title}>
      <div className="kardy-guide-heading">
        <div>
          <span className="kardy-guide-kicker">YOUR CHECKLIST</span>
          <h3>{title}</h3>
        </div>
        <span className="kardy-guide-count" role="status">
          {checked.length} / {items.length}
        </span>
      </div>
      <progress aria-label={`${title} progress`} max={items.length} value={checked.length} />
      <div className="kardy-guide-tasks">
        {items.map((item, index) => <button type="button" key={item} className="kardy-guide-task t-check" role="checkbox" aria-checked={checked.includes(index)} onClick={() => save(checked.includes(index) ? checked.filter(i => i !== index) : [...checked, index])}>
            <span className="kardy-guide-box" aria-hidden="true">
              <svg viewBox="0 0 10.1668 10.1668">
                <path ref={path => {
    if (path) path.style.setProperty("--check-len", String(Math.ceil(path.getTotalLength())));
  }} d="M1 5.52L3.92 9.17L9.17 1" />
              </svg>
            </span>
            <span>{item}</span>
          </button>)}
      </div>
      <div className="kardy-guide-footer">
        <small>
          {checked.length === items.length ? "Checklist complete. This is a personal reminder, not a system readiness check." : storage}
        </small>
        <button type="button" className="kardy-guide-reset" onClick={() => save([])} disabled={!checked.length}>
          Reset checklist
        </button>
      </div>
    </section>;
};

The Owner is responsible for the organisation, its team access, and billing.
Start with one brand and its first outlet; add more outlets under the same
organisation when they share a programme.

<GuideChecklist
  guide="owner"
  title="Your launch checklist"
  items={[
"My organisation has an active outlet and a clear reward.",
"I reviewed the card design, join page and outlet QR signs.",
"I checked programme activation and integration availability.",
"Each teammate has their own invitation and the appropriate role.",
]}
/>

## Launch your programme

<Steps>
  <Step title="Set up the organisation">
    Follow [organisation setup](/merchants/setup) to add your business details
    and outlets. Separate brands should have separate organisations.
  </Step>

  <Step title="Choose the reward">
    Set a clear reward and stamp cost. Decide which visits qualify and where the
    reward can be redeemed. Review [stamps and rewards](/features/rewards).
  </Step>

  <Step title="Prepare the customer experience">
    Review your card design, join page, and outlet-specific QR signs in
    [Branding](/features/branded-cards). Follow [Print and display your join
    QR](/guides/qr-signs) to prepare a counter sign and test the intended
    destination.
  </Step>

  <Step title="Confirm activation and availability">
    Review [plans and activation](/merchants/billing) and [feature
    availability](/availability). Creating an organisation does not activate a
    paid programme or external integrations. A demo preview is not a saved test
    transaction.
  </Step>
</Steps>

## Give each teammate their own access

Open **Organisation settings → Team & access**. Invite Managers who need permitted
programme configuration access and Staff who work the counter. Share the generated
invitation link; the recipient signs in with the invited, verified email and accepts.

Send teammates their [Manager guide](/guides/manager) or [Staff guide](/guides/staff).
Do not share your Owner login. Customer **Members** are not your employee list.

Review access when responsibilities change. You can change Manager/Staff roles,
revoke pending invitations, and remove teammates. The Owner cannot be downgraded
through the normal role controls. See [team management](/features/team-access).

## Oversee changes

* Confirm reward changes with the team before changing the customer promise.
* Review deletion carefully: unlocked claims on a deleted reward are lost, and
  deleting the last reward stops stamp earning and redemption.
* Keep outlet details and redemption eligibility accurate.
* Review your organisation's subscription and any integration setup separately.
* Check broadcast consent and delivery availability before approving member updates.

## Review your first recorded activity

After programme activation and a real qualifying visit, check **Overview** using
its store/date filters. Open **Members** to inspect reward readiness and the
member's history, then **View all activities** for their searchable audit record.
[Live view](/features/live-view) shows store pins and the latest ten recorded
events, not customer positions or online visitor counts.

Review **Settings → Usage & limits** before adding capacity or agent connections.
Manual keys and OAuth connections share the workspace's monthly MCP allowance;
adding a key does not reset it. See [usage limits](/features/usage-limits).

## Practise an access decision

<GuidePractice
  questions={[
{
  prompt:
    "A new cashier only needs to scan, stamp and redeem. Which role should you invite?",
  options: ["Owner", "Manager", "Staff"],
  correct: 2,
  explanation:
    "Staff provides authorised counter operations without configuration, team administration or billing access.",
},
{
  prompt:
    "You created a team invitation. How does the teammate join today?",
  options: [
    "Use the shared invitation link with their invited, verified email",
    "Wait for an automatic invitation email",
    "Use your Owner login",
  ],
  correct: 0,
  explanation:
    "Invitations currently produce a link to share manually. The recipient must sign in with the invited, verified email and accept it.",
},
{
  prompt:
    "The new Owner accepts a valid ownership transfer. What is your role afterwards?",
  options: [
    "You remain a second Owner",
    "You become a Manager",
    "Your account is deleted",
  ],
  correct: 1,
  explanation:
    "The accepting teammate becomes Owner and the previous Owner becomes Manager. Review billing separately after the handover.",
},
]}
/>

## Hand over or manage another brand

Ownership transfer requires verified identities and acceptance by the new Owner.
The previous Owner becomes a Manager after acceptance. Follow the
[ownership-transfer steps](/features/team-access#transfer-ownership), and review billing
details separately after the handover.

For another business, see [create and switch organisations](/features/multiple-brands).
Each organisation keeps its own programme, team, and subscription.
