{
  "version": "1.2",
  "lastUpdated": "2026-08-11",
  "market": "Southeast Asia (SG, MY, PH)",
  "locale": "en",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "licenseLabel": "CC BY 4.0 — attribution: heypeko.com",
  "sourceUrl": "https://heypeko.com/loyalty-transparency-standard",
  "scoring": {
    "pass": 1,
    "partial": 0.5,
    "fail": 0,
    "unknown": 0
  },
  "criteria": [
    {
      "id": "the-right-to-see",
      "name": "Criterion 1 — The right to see",
      "question": "Can the member independently see their point balance, tier, and available vouchers without asking staff?",
      "subCriteria": [
        {
          "id": "c1_balance",
          "name": "1a. Member sees balance"
        },
        {
          "id": "c1_tier",
          "name": "1b. Member sees tier"
        },
        {
          "id": "c1_vouchers",
          "name": "1c. Member sees voucher list"
        }
      ]
    },
    {
      "id": "self-service-redemption",
      "name": "Criterion 2 — Self-service redemption, on every channel",
      "question": "Can the member redeem a reward themselves, and can they do it on an online or delivery order as well as in-store?",
      "subCriteria": [
        {
          "id": "c2_self",
          "name": "2a. Self-service redemption"
        },
        {
          "id": "c2_channels",
          "name": "2b. Redemption channels"
        }
      ]
    },
    {
      "id": "between-visit-contact",
      "name": "Criterion 3 — The right to be contacted between visits",
      "question": "Does the member receive anything between visits, on a channel they read — and are the messages the ones that matter for retention?",
      "subCriteria": [
        {
          "id": "c3_channel",
          "name": "3a. Messaging channel"
        },
        {
          "id": "c3_triggers",
          "name": "3b. Trigger types"
        }
      ]
    },
    {
      "id": "enrolment-without-the-cashier",
      "name": "Criterion 4 — Enrolment that does not depend on the cashier",
      "question": "Can a customer join without a staff member initiating it — and if so, what prevents abuse?",
      "subCriteria": [
        {
          "id": "c4_paths",
          "name": "4a. Enrolment paths"
        },
        {
          "id": "c4_integrity",
          "name": "4b. Integrity controls"
        }
      ]
    },
    {
      "id": "enrolment-scope",
      "name": "Criterion 5 — Enrolment scope: only the payer, or the whole table?",
      "question": "Can people who did not pay — the rest of the table, the group, the companions — join the programme on that visit?",
      "subCriteria": [
        {
          "id": "c5_scope",
          "name": "5. Enrolment scope"
        }
      ]
    }
  ],
  "vendors": [
    {
      "id": "peko",
      "name": "PEKO",
      "score": 9.5,
      "maxScore": 10,
      "unknownCount": 0,
      "strength": "Strongest documented point: enrolment that does not pass through the cashier — self-service QR, in-venue check-in and receipt OCR on any POS.",
      "scores": {
        "c1_balance": {
          "verdict": "pass",
          "note": "Pass — members check their balance in WhatsApp / the member page (SG, MY, PH), without asking staff."
        },
        "c1_tier": {
          "verdict": "pass",
          "note": "Pass — tier is shown to the member."
        },
        "c1_vouchers": {
          "verdict": "pass",
          "note": "Pass — the live voucher list is shown to the member."
        },
        "c2_self": {
          "verdict": "pass",
          "note": "Pass — the member redeems from their own member wallet."
        },
        "c2_channels": {
          "verdict": "pass",
          "note": "In-store + online — redemption works on online orders and in-store."
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — WhatsApp (SG, MY, PH), Messenger, SMS and email."
        },
        "c3_triggers": {
          "verdict": "pass",
          "note": "Inactivity, points expiry, voucher expiry, tier progress, birthday, post-transaction."
        },
        "c4_paths": {
          "verdict": "pass",
          "note": "QR self-service, in-venue check-in, and receipt OCR — no POS integration required."
        },
        "c4_integrity": {
          "verdict": "pass",
          "note": "Per-customer hourly/daily scan limits, receipt-age limits, receipt-total thresholds, cross-customer duplicate-image matching with a configurable similarity threshold, repeated-failed-scan detection, and risk-tiered actions (block / hold for review / notify)."
        },
        "c5_scope": {
          "verdict": "partial",
          "note": "Pass — conditional on deployment: the QR has to be placed on tables or in the venue for non-payers to join; if the venue does not deploy the QR, only the receipt-scan path remains and the payer-only ceiling returns."
        }
      },
      "sources": [
        {
          "label": "heypeko.com — product",
          "href": "https://heypeko.com/product"
        },
        {
          "label": "heypeko.com — pricing",
          "href": "https://heypeko.com/pricing-details"
        },
        {
          "label": "heypeko.com — integrations",
          "href": "https://heypeko.com/integrations"
        }
      ],
      "openQuestions": []
    },
    {
      "id": "advocado",
      "name": "Advocado",
      "score": 3.5,
      "maxScore": 10,
      "unknownCount": 5,
      "strength": "Strongest documented point: a customer-facing rewards surface combined with campaign automation over SMS, email and WhatsApp, on a PSG pre-approved plan in Singapore.",
      "scores": {
        "c1_balance": {
          "verdict": "pass",
          "note": "Pass — a customer-facing rewards surface is documented, where members see their rewards balance."
        },
        "c1_tier": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c1_vouchers": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_self": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_channels": {
          "verdict": "partial",
          "note": "In-store — redemption at the point of sale is documented. Redemption on online or delivery orders: not stated in public documentation."
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — SMS, email and WhatsApp marketing channels are documented."
        },
        "c3_triggers": {
          "verdict": "partial",
          "note": "Partial — rule-based campaign automation including birthday and lapsed-customer campaigns is documented. Points-expiry and tier-progress triggers: not stated in public documentation."
        },
        "c4_paths": {
          "verdict": "partial",
          "note": "Partial — customer capture surfaces are documented (in-store sign-up, tablet/kiosk capture); whether enrolment can happen without the cashier asking is not stated in public documentation."
        },
        "c4_integrity": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c5_scope": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        }
      },
      "sources": [
        {
          "label": "advocado.co — product",
          "href": "https://www.advocado.co/"
        },
        {
          "label": "IMDA — PSG pre-approved solutions",
          "href": "https://www.imda.gov.sg/how-we-can-help/smes-go-digital"
        }
      ],
      "openQuestions": [
        "1b. Member sees tier",
        "1c. Member sees voucher list",
        "2a. Self-service redemption",
        "4b. Integrity controls",
        "5. Enrolment scope"
      ]
    },
    {
      "id": "eber",
      "name": "Eber",
      "score": 7.5,
      "maxScore": 10,
      "unknownCount": 1,
      "strength": "Strongest documented point: a full member app and web wallet with a self sign-up link and QR, so joining does not require a staff-side action.",
      "scores": {
        "c1_balance": {
          "verdict": "pass",
          "note": "Pass — the member app / web wallet shows the member's points balance."
        },
        "c1_tier": {
          "verdict": "pass",
          "note": "Pass — membership tiers are shown in the member app per the documentation."
        },
        "c1_vouchers": {
          "verdict": "pass",
          "note": "Pass — vouchers and rewards held by the member are listed in the wallet."
        },
        "c2_self": {
          "verdict": "pass",
          "note": "Pass — members redeem rewards from the app themselves."
        },
        "c2_channels": {
          "verdict": "partial",
          "note": "In-store + online — documentation covers POS and e-commerce integrations. Redemption on aggregator delivery orders: not stated in public documentation."
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — email, SMS and app push are documented, with WhatsApp available as an add-on."
        },
        "c3_triggers": {
          "verdict": "partial",
          "note": "Partial — segmentation and scheduled/automated campaigns including birthday are documented. A predictive at-risk trigger is not documented; points-expiry reminders: not stated in public documentation."
        },
        "c4_paths": {
          "verdict": "pass",
          "note": "Pass — a self sign-up link and QR are documented, so a customer can join without a cashier."
        },
        "c4_integrity": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c5_scope": {
          "verdict": "partial",
          "note": "Partial — the self sign-up link can be shared with anyone, so joining is not payer-bound; whether accrual is available to a non-paying member of the party is not stated in public documentation."
        }
      },
      "sources": [
        {
          "label": "eber.co — product",
          "href": "https://www.eber.co/"
        },
        {
          "label": "eber.co — pricing",
          "href": "https://www.eber.co/pricing"
        }
      ],
      "openQuestions": [
        "4b. Integrity controls"
      ]
    },
    {
      "id": "ocard",
      "name": "Ocard",
      "score": 7.5,
      "maxScore": 10,
      "unknownCount": 1,
      "strength": "Strongest documented point: a shared member app used across many venues, so a member arrives with the app already installed rather than joining from zero.",
      "scores": {
        "c1_balance": {
          "verdict": "pass",
          "note": "Pass — the shared member app shows the member's points balance per venue."
        },
        "c1_tier": {
          "verdict": "pass",
          "note": "Pass — member levels are shown in the app per the documentation."
        },
        "c1_vouchers": {
          "verdict": "pass",
          "note": "Pass — coupons and rewards held by the member are listed in the app."
        },
        "c2_self": {
          "verdict": "pass",
          "note": "Pass — members redeem coupons from the app themselves."
        },
        "c2_channels": {
          "verdict": "partial",
          "note": "In-store + online ordering — documentation covers in-venue redemption and Ocard's own ordering surface. Redemption on third-party delivery orders: not stated in public documentation."
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — app push notifications and messaging to members are documented."
        },
        "c3_triggers": {
          "verdict": "partial",
          "note": "Partial — a win-back campaign triggered at 60 days of inactivity is documented, alongside birthday campaigns. Points-expiry and tier-progress triggers: not stated in public documentation."
        },
        "c4_paths": {
          "verdict": "pass",
          "note": "Pass — members join through the app themselves, documented independently of a cashier prompt."
        },
        "c4_integrity": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c5_scope": {
          "verdict": "partial",
          "note": "Partial — anyone can install the app and join without paying, but accrual is documented against the transaction, so a non-paying member of the party earns nothing."
        }
      },
      "sources": [
        {
          "label": "ocard.co — product",
          "href": "https://www.ocard.co/"
        },
        {
          "label": "Ocard blog — win-back campaigns",
          "href": "https://www.ocard.co/blog"
        }
      ],
      "openQuestions": [
        "4b. Integrity controls"
      ]
    },
    {
      "id": "stampede",
      "name": "Stampede",
      "score": 3.5,
      "maxScore": 10,
      "unknownCount": 6,
      "strength": "Strongest documented point: WiFi captive-portal capture, which enrols anyone in the room who connects — enrolment is not tied to the person who pays.",
      "scores": {
        "c1_balance": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c1_tier": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c1_vouchers": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_self": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_channels": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — email and SMS marketing to captured guests is documented."
        },
        "c3_triggers": {
          "verdict": "partial",
          "note": "Partial — birthday and lapsed-visit automations are documented. Points-expiry, voucher-expiry and tier-progress triggers: not stated in public documentation."
        },
        "c4_paths": {
          "verdict": "pass",
          "note": "Pass — guests enrol themselves through the WiFi captive portal, with no staff action required."
        },
        "c4_integrity": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c5_scope": {
          "verdict": "pass",
          "note": "Pass — every guest who connects to the WiFi is captured, including people who did not pay for the table."
        }
      },
      "sources": [
        {
          "label": "stampede.ai — product",
          "href": "https://www.stampede.ai/"
        },
        {
          "label": "stampede.ai — WiFi marketing",
          "href": "https://www.stampede.ai/wifi-marketing"
        }
      ],
      "openQuestions": [
        "1a. Member sees balance",
        "1b. Member sees tier",
        "1c. Member sees voucher list",
        "2a. Self-service redemption",
        "2b. Redemption channels",
        "4b. Integrity controls"
      ]
    },
    {
      "id": "storehub-loyalty",
      "name": "StoreHub Loyalty",
      "score": 2,
      "maxScore": 10,
      "unknownCount": 5,
      "strength": "Strongest documented point: loyalty built into the POS the venue already runs, with cashback accrual and engagement campaigns configured in the same back office.",
      "scores": {
        "c1_balance": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c1_tier": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c1_vouchers": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_self": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c2_channels": {
          "verdict": "partial",
          "note": "In-store — cashback redemption at the POS is documented. Beep online ordering is documented as a sales channel; whether loyalty redemption applies to those orders is not stated in public documentation."
        },
        "c3_channel": {
          "verdict": "pass",
          "note": "Pass — SMS and app-based engagement campaigns to customers are documented."
        },
        "c3_triggers": {
          "verdict": "partial",
          "note": "Partial — inactive-customer and cashback-reminder campaigns are documented. Tier-progress triggers: not stated in public documentation."
        },
        "c4_paths": {
          "verdict": "fail",
          "note": "Fail — documentation describes the cashier capturing the customer's phone number at checkout as the enrolment path; no self-service enrolment path is described."
        },
        "c4_integrity": {
          "verdict": "unknown",
          "note": "Not stated in public documentation"
        },
        "c5_scope": {
          "verdict": "fail",
          "note": "Fail — enrolment and accrual are documented against the paying transaction, so only the payer joins."
        }
      },
      "sources": [
        {
          "label": "storehub.com — loyalty",
          "href": "https://www.storehub.com/en-my/loyalty/"
        },
        {
          "label": "storehub.com — Beep online ordering",
          "href": "https://www.storehub.com/en-my/beep/"
        }
      ],
      "openQuestions": [
        "1a. Member sees balance",
        "1b. Member sees tier",
        "1c. Member sees voucher list",
        "2a. Self-service redemption",
        "4b. Integrity controls"
      ]
    }
  ]
}
