---
title: "On site, at a kiosk or with a QR code"
description: "At a stand, a return point or on a product, a shared screen or a scanned page lets the person pick the charity on the spot."
canonical: https://www.charitips.com/docs/use-cases/on-site
---

# On site, at a kiosk or with a QR code

> At a stand, a return point or on a product, a shared screen or a scanned page lets the person pick the charity on the spot.

- **Who pays**: Your company
- **Starts with**: A customer action
- **Tax receipt**: In your company's name
- Needs [API access](https://www.charitips.com/docs/overview/plans.md#api-access-for-webhooks-and-credentials) on a validated account. [Plans](https://www.charitips.com/docs/overview/plans.md#what-every-flow-needs)

Interactive demo on the page. The same flow as a build spec: https://www.charitips.com/docs/demos/onsite/cup-return.md

**Scenarios this flow covers:**

- [A contact collected with the choice](https://www.charitips.com/docs/use-cases/on-site.md#collect-a-contact-with-the-choice): The claim also records the person's contact, on a campaign with lead collection.
- [One donation a day](https://www.charitips.com/docs/use-cases/on-site.md#group-small-amounts-per-day): Returns or sales at the till add up, and one donation per day or per month carries them.
- [A QR code on a product](https://www.charitips.com/docs/use-cases/on-site/product-qr.md): The serial number of the product is the donation's unique id: a code scanned twice gives once.

**Variants**: the same flow in other sectors, each with its build spec.

- [Cup returned at a festival](https://www.charitips.com/docs/use-cases/on-site/cup-return.md) (Culture and events): At a festival return point, each cup put on the tray gives 0,50 €, paid by the festival. The attendee taps the charity on the shared screen; the receipt goes to the festival. 0,50 € per cup returned. Build spec: https://www.charitips.com/docs/demos/onsite/cup-return.md
- [Game at an event stand](https://www.charitips.com/docs/use-cases/on-site/stand-game.md) (Culture and events): A brand's event stand runs a game: a winning slot gives 1 € to 10 €. The visitor picks the charity on the stand's screen, or scans a code to choose later; the brand pays. 1 € to 10 € per win. Build spec: https://www.charitips.com/docs/demos/onsite/stand-game.md
- [Contact left at a stand](https://www.charitips.com/docs/use-cases/on-site/stand-lead.md) (Culture and events): At a trade show, an exhibitor gives 0,50 € for each visitor who leaves their details. One tap on the stand's tablet sends the contact and the charity choice; the exhibitor pays. 0,50 € per contact. Build spec: https://www.charitips.com/docs/demos/onsite/stand-lead.md
- [QR code on a product](https://www.charitips.com/docs/use-cases/on-site/product-qr.md) (Retail): A QR code under a product's cap gives 2 % of the price once scanned after purchase. The buyer picks the charity on the scanned page; one donation per code, paid by the brand. 2 % of the price, scanned after purchase. Build spec: https://www.charitips.com/docs/demos/onsite/product-qr.md
- [Packaging returned in store](https://www.charitips.com/docs/use-cases/on-site/packaging-return.md) (Retail): A shop gives 0,10 € for each packaging item dropped at its collection point. The customer picks the charity once; the shop sends the month's total as one donation. 0,10 € per item returned, settled monthly. Build spec: https://www.charitips.com/docs/demos/onsite/packaging-return.md
- [Cashless wristband top-ups](https://www.charitips.com/docs/use-cases/on-site/cashless-top-up.md) (Culture and events): A festival gives 0,50 € for each cashless wristband top-up. The attendee picks the charity once at the top-up station; after the last day, the festival sends the total. 0,50 € per top-up, sent after the festival. Build spec: https://www.charitips.com/docs/demos/onsite/cashless-top-up.md

## Build it
- **Calls**: [`create-charities-selection`](https://www.charitips.com/docs/api-reference/create-charities-selection.md), [`create-campaign`](https://www.charitips.com/docs/api-reference/create-campaign.md), [`activate-campaign`](https://www.charitips.com/docs/api-reference/activate-campaign.md), [`create-donation`](https://www.charitips.com/docs/api-reference/create-donation.md), [`claim-donation`](https://www.charitips.com/docs/api-reference/claim-donation.md)
- **Webhooks**: `donation_create`, `donation_update`

### Set up the campaign

Once, create a charities selection, a campaign with its `charitiesSelectionId`, then activate it, as in [steps 3 to 5 of Your first donation](https://www.charitips.com/docs/get-started/first-donation.md#3-pick-your-charities).

```bash
curl -X POST https://api.sandbox.charitips.com/v1/campaigns \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Cup returns",
    "charitiesSelectionId": "<charitiesSelectionId>"
  }'
```

### Give from your server

When the person acts (a cup handed back, a game won, a code scanned), your kiosk or your page asks your server to create the donation. Your server holds the API key: the kiosk and the scanned page only talk to it. For a QR code on a product, use the product's serial number as `uniqueExternalId`, so a code scanned twice gives once.

```bash
curl -X POST https://api.sandbox.charitips.com/v1/donations \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "campaignId": "<campaignId>",
    "amount": 50,
    "uniqueExternalId": "cup_return_2026_07_12_0412"
  }'
```

### Let the person pick on screen

The screen shows the charities, and the tap [claims the donation](https://www.charitips.com/docs/api-reference/claim-donation.md). Nobody signs in. Then the kiosk goes back to its first screen for the next person.

```bash
curl -X POST https://api.sandbox.charitips.com/v1/donations/<donationId>/claim \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "charityId": "<charityId>"
  }'
```

### Collect a contact with the choice

At a trade show stand, the claim can also record the person's contact. Create the campaign with `withLeadCollection: true` and `leadCollectionOptions` set to `{"fullname": true, "companyName": true, "email": true, "phone": true, "custom": false}`, where `custom` is a question or `false`. Send `leadCollectionOptions` as one object, as shown here. Then send the contact with the claim, `hasAcceptedTerms` included.

```bash
curl -X POST https://api.sandbox.charitips.com/v1/donations/<donationId>/claim \
  -H "Authorization: Bearer $CHARITIPS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "charityId": "<charityId>",
    "lead": {
      "fullname": "Camille Martin",
      "companyName": "Martin Consulting",
      "email": "camille.martin@example.com",
      "phone": "+33 6 12 34 56 78",
      "hasAcceptedTerms": true
    }
  }'
```

### Group small amounts per day

Returns at a bin or sales at a till can be many small amounts. Count them on your side and create one donation per day or per month, with the date in `uniqueExternalId` and the charity your customer saved, or yours.

## Edge cases

- **Nobody chooses.** The donation is assigned automatically when it expires or when the campaign closes: none is lost.
- **A code scanned twice.** The second scan reads the donation already made. The serial is the only guard: check the purchase on your side if it matters.
- **A claim without the contact.** On a lead collection campaign, the lead fields are `fullname`, `companyName`, `email`, `phone` and `custom`, and the claim is refused with `400 Lead is required` when `lead` is missing.
- **Fiscal receipts.** You fund the donations, so the receipt goes to your company.

## Related pages

- [Campaigns](https://www.charitips.com/docs/concepts/campaigns.md)
- [Donation lifecycle](https://www.charitips.com/docs/concepts/donation-lifecycle.md)
- [Webhooks](https://www.charitips.com/docs/webhooks/configuration.md)
