How to set up your digital membership program so your cards can be scanned by local business partners.
I frequently get asked how to cater for scenarios, where you have a community of members with different levels.
Let’s take a university as an example, where you might have students, you have faculty members and you have alumni. Ultimately you want all of these members to enjoy different discounts at local businesses like restaurants or coffee shops etc. A University is just one example, but it could be any type of community club like residents or business community; that type of stuff. So what I want to do is show you how you can set this up in PassKit and combine this with our CodeReadR scanning integration to make sure that the cards can be scanned at the merchant and ultimately have the data flowing back to PassKit.
The other question that we frequently get asked is how does PassKit and CodeReadR relate together? So do I need to set up multiple projects in PassKit and do I need to then enable an integration in CodeReadR for all of those? So let’s say. I want to do a membership program, but in parallel, I might also want to, run, coupons for a coffee shop. So I want to address that as well.
What I’ve done is I’ve already set up a membership project and this is called university members. In here.,I have three designs. I have a student card, 5% discount faculty member, 10% discount and alumni, 15% discounts.
So clicking in here, we can see the card designs, they’re very basic. And we have some text at the base of the card here, where it says scan this card at participating retailers for special discounts. We could Bob’s Coffee, Pizza Forever, The Beer Garden and Sloppy Joe’s. All very healthy choices!
And then for the faculty members, we got 10% off and the rest of the card is exactly the same. So, we’ve got here where the participating retailers are; and you can put whatever you want on here. This is just an example of a tier discount program where different types of member would get different benefits.
So that’s my one program. That’s my university program. And then I’ve set up another program because with the coffee shop that I’m having a relationship with for my university members, I’m actually also helping them to do coupons for redeeming free coffee. So, in here we have a very simple coupon design. Basically it’s a one of coupon that I can use to then go to the coffee shop and redeem a coffee. So , the coffee shop should be able to accept both my membership cards, but also my coupons and all the other participating shops, like the pizza shop and the sloppy Joe shop and the beer garden should only accept the membership cards now.
The way that the integration works between PassKit and CodeReadR. Each of the projects that you have here can be configured for multiple events for Code ReadR. So if I go into my university project here and I go to settings and then to integrations, I can see at the top here the CodeReadR integration; which I’m sure you’re quite familiar with by now.
And I can see it as it’s already enabled for me. And I can see here, which events I want to enable it to. For this one, I’ve just said to verify member event, because this is not a loyalty program. I’m not collecting points. I have no interest in allowing the retailers to change the tier of the members, for example.
So I just want to do the verify member event. And for that event, I have this particular URL. Now, when you go into CodeReadR, and you define your services; a service in CodeReadR is a set of configurations that tells the CodeReadR app what to do when a card is scanned and then what to do with the data and where to send it to and what uses to allow access to it.
These URLs that you see here for each events, these are what you need when you set up the, service in Code ReadR. In this case, I’ve only set up one service in CodeReadR for verifying member. And you can see here, there is a verified member event. And if we look at the URL that this is posting to, then this is exactly the URL that we copied from here.
Let’s say if I also wanted to enable points earning for this particular project. Then I could copy this and I could set up another server in CodeReadR and that we call earning points and then I could enable merchants to also earn points. So that’s how it connects together.
So one project in PassKit can respond to multiple events in CodeReadR. CodeReadR needs to have a separate service for each event. So if, I want to do something with all these events for the project, and there is a total of seven in here, I would have to set up seven different services in CodeReadR. And then when the user logs into the app, the first thing to do is they select the service. So to basically say, okay, I want to check into member and scan, or they say, I want to earn points for a member; click that service and then scan, the membership card and award the points. So that’s how it’s structured together.
If you’re wondering what the best approach is; if you have a tiered program, like I’ve done here for my university program, then you have your three tiers in PassKit and you would have one service in CodeReadR. And then inside of CoderReadR you can then set up your merchant. So as we just said in our design here, and again, it’s just dummy demo stuff, but if I go to the back of the card, where I say these are my retailers that are participating in this promotion. Then I can go into CodeReadR and I can create user accounts. So each of these merchants or retailers, I want to give their own login. I want to give them their own account. And the reason we do that is because when they log in and scan, then we can later on tie back the data to the user accounts. So we can see that member Patrick was scanned five times at Sloppy Joe’s or member Paul was scanned twice at beer garden. This allows you to tie the data back and then tied back to individual users and merchants. Now what I’ve done here, I’ve just set up one user account for each of the merchants. But there’s no reason if there is three employees working at, Joe sloppy is that you want to set up Joe sloppy one, two and three. This gives you a lot of granularity and access on who can scan what and how that works.
And then when we’re looking at our services, we can say, which users are allowed to access a service. If I go into my verify member service, Then I have a user tab here and we can see that all four uses Bob’s coffee, pizza forever, beer garden, and Joe’s sloppies are allowed to use this service.
Now, as I said, I’ve also set up a coupon project. So for my coupon project, I’m purely doing something with the coffee shop alone. So the coupon project that I have here, I only want bob’s coffee shop to be able to scan these cards. So I’ve set up a second service , which I call it redeem coupon. And this is linking to the URL for this particular project. So if we go back to PassKit. I go into my coupon project. I go into settings, I go to integrations and under Code ReadR , I can see different coupons.
We only support the redeem event. So this URL I’ve copied. And I’ve then created a service here for this URL. So if we look at this service and we go to the user tab , then we can see that only Bob’s coffee is allowed to access this service. So we got my device here and if I open up the Code ReadR app. Now, I want to log in with beer garden. So this would be the login you give to the beer garden shop. Then we could see here that under the services for this particular account is only to verify member service and that’s all that this user will be able to do. if we now scan a membership card. let’s go into PassKit. Let’s go to university members and let’s create a new member record for a student.
I’m going to visit the pass URL. In this particular case, I’m going to install it in Google Pay on my desktop so I can show you guys what’s happening. But of course, if the customer visits this on their mobile, they get the appropriate mobile experience with Apple wallet, Google Pay. So that’s my card 5% off can scan it at these vendors. If I now click verify member, and I scan this card then, Oh, I built this service that I also want to collect data on how much money they spend. So this is optional. You don’t have to do this, but you can collect additional data. So especially when you’re dealing with a variety of retailers and merchants, where it’s of benefit to you to see how much your students spend, or maybe you’re building some kind of other promotions that you want to do targeted messaging and you like to have this data fed back. Now, obviously you’ll make, you have to make that agreement with, the retailer, with the merchant. Not, every merchant might be inclined to share this data, but it all depends on the offering and kind of the business structure that you put in place. But let’s say I spend $20. Submit. And now just tells me verified member, Patrick Kostergirl and members is in tier student 5%. So this now tells the shop that, okay, this card is valid and this is a student card. So then on the point of sale, they can give this person 5% discount. Let’s say if I would scan an alumni card or if I would scan a card, now let’s say, we enrolled another member and we enrolled this person as an alumni. And this is Patrick, alumni. You could also change the member to your, by the way. So if somebody upgrades from being a student, they graduated. So to say, to become an alumni, then you can also change it here throughout at member, but let’s go to the URL for the alumni card and I’m going to also install this in Google Pay.
Let’s scan the alumni card and then we’ll see that again. I get asked the question, how much do I spend 20 bucks submit? And now we see verified member Patrick alumni members into your alumni, 15%. So now they can give a different discount because they can see, I’m an alumni. So I’m entitled to more.
Now let’s say if this same shop would now try to scan coupons, right? With this, same service. So let’s create a coupon here and we visit the coupon URL. So if I would try to scan this coupon with the verified member service, then I get the same question because that’s how the service is configured. And then this will say, could not verify a member card because it can’t find a member ID, because what this is trying to do is it’s trying to look into membership project for this particular pass ID, which doesn’t exist. So this particular person is not able to scan coupons. They can only do membership cards. Now, if we would log out and if, instead of logging in this beer garden, I’m logging as the coffee shop. Logging in as Bob’s coffee, then we can see here that I have two services. I have redeem coupon and verify member that’s because in my Admin panel in Code ReadR, I said that Bob’s coffee is entitled to use both the redeemed coupon service and the verify member service. So if I’m trying to redeem the coupon, then I can. Coupon redeemed. Now let’s say I’m still in the coffee shop and now a member comes in and I want to scan the member card, I can just simply back out here and I can select a different service for verifying the member, click, continue, click, tap to scan, and I’ve scanned it and asked me how much I spent. We get the same flow. And now we can see that this, again, this member has now been scanned for 15% . If we then look at the data that this puts back into PassKit. If we now go to our university member program and we go to members, then we see here a tab called member events.
And in here we see the three events happen and it’s correct because I scanned myself while I scan the 5% student once and scanned the other one twice. So let’s say we want to see tier ID. We want to see the event type, captured things like latitude and longitude . And then the external user ID is pretty important here because this contains the user ID from Code ReadR. So if I look at this data, I can see this alumni guy was scanned twice. The student was scanned once. This is the lat and long. I believe we have address as well. Yeah. We get address. So we can see here, where I’m sitting.
So, we can see the date of which it was scanned. We can see the name. So we get all this good data in here. So you can now tie this back. You can simply export a CSV. We can see the user ID is here so we can see here that Patrick alumni was scanned twice; once by the user ending in 543. And if we go into CodeReadR, and we look at users, we can see the user IDs here so we can see here that 543 is Bob’s coffee.
And then the other scan that was done here and the on 545 and 545 is beer garden. So basically this is super powerful now, so you can export all this data and then tie it back to where the scans happened. You can see when the members visited, how frequently they visit, if you captured the bill amount, you get good insight and that data.
Literally, in 10 to 15 minutes to hook this all up and put this together and now we have all this powerful data and super easy scanning capability that you can deploy to the merchants and the shops or companies that you work with.
One more thing if you are technical.
One of the other things that I wanted to quickly cover is, in my university member program. I have three tiers. So I’ve got student, faculty member and alumni. Now, if we go to the distribution form. These forms basically enroll you into the base tier. So I have three tiers, but my base tier is students. If I enrolled a member here, Then this member is always going to be enrolled into the base tier, which is students. So that’s a bit annoying, right? If you want, for example, to allow alumni to enroll themselves, or you want faculty members to enroll themselves, you can’t do that with these public pages because they always go through students. So unless you do an API integration or unless you do a Zapier integration, it looks like this is not possible. Now what we have recently done is we’ve added functionality into the API that allows you to unlock enrollment forms for these tiers. And apologies, if I get too technical, I’m going to be making API calls.
Now this is functionality that we are looking to put into the graphical user interface at some point in future. But right now, this is only possible via API. That’s not a problem. If you do get stuck or if you need help, then you can just reach out to us in our support channels. And then one of our team members will be more than happy to help you to enable enrollment forms for the individual tiers.
So how to do it is, you need to copy the tier ID and then the end point that we going to be getting you, can find our documentation docs.Passkit.io, and then clicking on members and loyalty. Two things that we’re going to do. We need to modify the tier record and we need to allow the tier record to be enrolled into directly.
So we need to tier endpoint point first. So get tier you can copy this. And I already have my postman set up here to talk to my account that I’m logged into. I’m not going go into postman now, but this is a kind of a graphical interface that allows me to make API calls very simply. We have some really good help resources available and help.passkit.com if you want to learn how to use the API.
So what we need here is we need our program ID and our Tier ID to get the Tier record. So if I go back to my interface. Design’s overview. I got my program ID here, which is the same for all the tiers. I’m going to copy that.
I’m gonna replace this here. And then I need my TierID, which in this case is called faculty. And I have that here and then I’m doing a GET request and the header automatically sets my token, which it generates from my environment that I’ve set up. So by hitting this. I get my payload back here and we can see all the tier data in here.
So you can see the name. We can see the program, it belongs to, we can see the template it belongs to, but what I’m interested in is the setting here at the bottom, which says allowTierEnrolment is false. And I need to set this to true because I want people to enroll in tutor tiers. So I’m going to copy all of this.
I’m going to change this from a, GET to a PUT and a PUT means that we’re going to be updating the record. I’m going to paste this in here. And I’m going to toggle this from false to true, and that should be all that we need to do. So if I do a PUT now, sorry, let me move these things here. And this is the end point for updating.
And now we can see it’s updated and we can see here that now it’s set to true. Now, how do I access the enrollment page then? Because in here it is nothing that tells me that there is auto URLs to enroll in. All I get here from distribution is this link here. Now you can use the same link format, but instead of doing /c in here, we going to be changing this to a t – from tier. And then this code at the end, which we call the shortcode, we’re going to delete. And we’re going to replace that with the short code from the template here. So at the bottom here, you can see short code here. You can copy this. And this now shows me the enrollment form for the tiers.
The enrollment forms settings sit on a template level, so you can also use our templates API to modify the form. If you want to put different texts here, if you want to put different fields, because you might be collecting different data for different, tiers. But we’ll, save that for a separate subject. But now I enroll here in Patrick faculty.
Then we can now see on my role as a faculty member. So that’s, the way on how you can enable tier enrollment. Depending on your use case, you might not want that. So you might just want the students to enroll themselves, but anybody, but a bigger tier or a bigger discount, you still want some kind of administration process in place.
So do also have a look at our videos for Zapier or videos for API integration, because those will be good ways for you to have more granular control about who you enroll into the system, or even if you tie it into kind of an existing system or a CRM integration.
All right. Hopefully this shed some light on how the PassKit integration and CodeReadR integration works together and looking forward to any feedback or any inquiries and looking forward to see what you guys create.