This documentation https://docs.civicrm.org/user/en/latest/common-workflows/tokens-and-mail-merge/#checksum-contribution-pages shows

        Checksum for Contribution Pages¶
To send people to a contribution page use this path where IDNUMBER is the ID of your contribution page:

Drupal: http://example.org/civicrm/contribute/transact?reset=1&id=IDNUMBER&{contact.checksum}&cid={contact.contact_id}

It works when I am logged in, because it does not need the hash, but does not work for anonymous users. Other questions on StackExchange indicate Need &cs= before the hash, but that also does not work. (Seems really weird to have a query string without a variablename= as part of it.)

Examples where the domain is removed for security: Original attempt failed: .../civicrm/contribute/transact?reset=1&id=2&c8950946c952d8cdec67695d0b10cd03&cid=13299

Changed attempt failed (adding the "cs=" also makes it fail when I am logged in as admin): .../civicrm/contribute/transact?reset=1&id=2&cs=c8950946c952d8cdec67695d0b10cd03&cid=13299

Reordering the elements does not work, as I expected it would not.

  • That doesn't look like a proper checksum. A proper url looks like https://example.org/civicrm/contribute/transact?reset=1&id=1&cs=a4eeb6083ff2ed04273e956f8914b937_1667889635_168&cid=60, where the token already includes the cs= so don't need to add it again, and especially note the additional bit on the checksum after the underscore. I'm not sure why it would be cut off. Do you have any related extensions installed that might change the token?
    – Demerit
    Commented Nov 8, 2022 at 6:47
  • I was exporting the data so I can created printed QR codes on letters. The field I exported was "Contact Hash" which is same as "hash" in civicrm_contact. Is there a way to get that data exported out?
    – TimETown
    Commented Nov 8, 2022 at 21:49

1 Answer 1


It looks like you are taking the contact hash directly from the database and sticking it in the URL yourself. That won't work (and for security reasons you don't want to expose the contact hash because that doesn't change).

Instead, you want a contact checksum, which is generated from the hash. You can get a checksum by sending an email or mailing with the {contact.checksum} token in it. If you want to get one manually for whatever reason, you can use the API4 Explorer and do Contact getChecksum.

  • Thank you both! I find I can create a CSV file by merge-printing to html this string: "{contact.id}", "{contact.addressee_display}", "{contact.hash}", "{contact.checksum}","{dates.checksum_expiration}" ... or use the API, as you suggested!
    – TimETown
    Commented Nov 8, 2022 at 22:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.