Skip to main content

Register a purchase

When an identified contact finalizes a purchase, it should be sent to Engage and made available for segmentation and reporting. Usually a finalized purchase means that payment has been successfully processed.

The data is sent to the following endpoint:

POST /api/v2/receipts

Data sent here cannot be reversed or updated, hence the importance of only sending finalized purchases.


To be able to store a transaction in Voyado, you'll need to connect it to a specific contact.

In this example the contact type is “Member” and the key type is “memberNumber” (normally a unique sequence created by Voyado). The key has to be a unique data field for the specific contact type. One of these fields is used:

  • contactId

  • email

  • mobilePhone

  • memberNumber

  • externalId

  • socialSecurityNumber (actually a Swedish or Finnish Personal Identification Number)

However, the key used does NOT have to be the key value for the specific contact type.

Example payload

    "contact": {
        "matchKey": "1c277c0a-ed93-4928-86cb-b0820090c111",
        "matchKeyType": "contactId"
    "uniqueReceiptId": "20180906468464468",
    "receiptNumber": "468464468",
    "createdDate": "2018-09-06T15:55:54+01:00",
    "storeExternalId": "321",
    "currency": "NOK",
    "exchangeRateToGroupCurrency": 1.0,
    "totalGrossPrice": 200.00,
    "paymentMethods": [{
        "type": "Card",
        "description": "Debit Card",
        "value": 200.00
    "items": [{
        "type": "PURCHASE",
        "quantity": 2,
        "grossPaidPrice": 200.00,
        "taxAmount": 40.00,
        "taxPercent": 25.00,
        "sku": "10015563434",
        "articleNumber": "2324234",
        "articleName": "Ipsum Wool Jacket",
        "articleGroup": "Jackets",
        "extraData": [{
            "name": "campaign",
            "value": "Socks 3 for 2"
        }, {
            "name": "size",
            "value": "M"
        "marginPercent": "25.00",
        "awardsBonus": false,
        "discounts": [{
            "type": "325",
            "description": "50% autumn discount",
            "value": -200.00
    "usedBonusChecks": [{
        "checkNumber": "2342"
    "usedPromotions": [{
        "promotionId": "6543dfaa-31c5-4e34-bb88-7ccfc5fe8bf7"

If contact.matchKeyType is set to contactId, then contact.contactType is not a required field. In this case, if the value is not given, Engage will just use whatever your default contact type is.

A successful POST operation returns a 202 (Accepted).

Transactions can also be imported through an XML file format. Read more about in this article, Receipt XML import.

Find the complete list of transaction field definitions here.