Stripe is obviously good for charging credit cards. Subscriptions & Plans work great for SAAS. A feature that is not so obvious but I’m finding really useful is Stripe’s ability to add metadata to a client entry. Metadata can be any name/value pair and looks like this in the Stripe web interface:
So what can you use it for?
I have a software program I sell that comes with a free 30 day demo period. I put the expire date of the demo period in the Stripe metadata. I could hide that in the data of the program in one way or another, but what happens when a potential customer calls and says they’d like a little more time to test out the software? With the data in Stripe, I can easily go into the Stripe web interface, change the date, and they’re good to go.
I also put the version number of my software in Stripe metadata. When a tech support email comes in, I can easily check for myself what version of my software they are using.
Since it is demo software, I also store the last time the software was used. This let’s me see demos that are no longer being used.
On a simpler level, I can store name/phone number/email information in the metadata. Again, when that tech support email comes in, I can figure out what company it is and can call them back if need be.
Updating Stripe metadata is straight-forward using the StripeX library in VFPX:
* Create/Update the Stripe customer record
oStripe.AddMetaData("Last Update", TTOC(DATETIME()))
oStripe.AddMetaData("Version", oVar.zAppDate + ": " + oVar.zAppVersion)
oStripe.AddMetaData("Active Count", TRANSFORM(lActiveCnt))
lCustID = oStripe.Customer(zsysvar("CustID"), lName)
As a computer programmer, I’m legally barred from having any artistic ability whatsoever. That was fine back in the days of punch cards, but it’s super inconvenient today because computers today come with screens. Screens that frequently need graphics.
Canva.com has been a huge help for me when I need to create some simple graphics – a banner, a business card, a button image, a Facebook ad, whatever. It’s mostly free (you can pay a couple bucks for graphics and such), easy to use and flexible.
Here’s a quick graphic I did for a business card for my local PTSA. I stole the graphic from the school website (thanks Snagit!) and combined it with some text using Canva:
And a banner I could slap into my Teamviewer client:
A skilled graphic artist would certainly do better, but for all my quick & free needs, Canva has been great.
Last week I bit the bullet and bought the full version of Teamviewer and I already loving it. Having clients do Help > Start Remote Control from my app’s menu (and then my code is simply run / TeamView—-) is worlds easier than directing them to a website to download an EXE.
Today I had a client trying to move my app from one computer to another. They were having trouble as clients sometimes do. I was on the new computer, but needed files from the old computer. So I had the client start remote support on the old computer, while I was still connected to the new computer…. and it worked. I had two sessions of Teamviewer running connecting me to both computers at the same time.
I had them up and running in 10 minutes with no hassle. Pretty slick.
After a couple successful months with the free Teamviewer, I finally bit the ($800) bullet and bought the full version. Yeah, that feels expensive, but I figure it will eventually be cheaper than the monthly or the pay-as-you-go services. :: crosses-fingers ::
One of the nice features of TeamViewer is that it’s a simply EXE that the client runs to start a remote control session (Teamviewer calls it Quick Support). I can distribute this EXE to my clients with my app and call it directly from my VFP app — no walking them through a download from a website, trying to find their download folder, and then getting them to run it. Very easy.
When a user wants support, their name shows up in my TeamViewer admin panel. I just click on that to start the support. Here’s a user named Administrator wanting support:
Another nice touch is that you can customize the program on the client to look how you want. You can add your logo, change the text around, and change the colors. So my clients see this customized version rather than some confusing screen with some other company’s name on it:
And, you can have multiple quick support screens. So one group of clients get the one above, while other clients have this one:
Easy to use, easy to implement to the client, customizable so it looks like my product, and – hopefully – a price tag that breaks even in not too long.
Gotcha: One gotcha to look out for. The EXE you’re sending to your client has a got an ugly name like “TeamViewerQS-en-idXXXXXX.EXE”. If you change that name, it will still work but it won’t show your customized screen. You have to use that file name to get your customized screen.
I’ve pretty much given over everything to Google at this point with two hold outs remaining: OneNote for notes (thanks to the Eric Selje presentation at Southwest Fox) and gQueues for managing tasks/to-dos.
I keep hoping that Google Keep might be able to replace those two things – giving me a little more integration and giving Goole a little more of my soul – but the app is missing a couple key things:
- No text formatting. I could probably live without bold/italics, but Keep’s inability to – for example – let me copy a table from a web page and paste it in is kind of a killer.
- Keep can’t order your notes within a label. Sure, Keep will let you rearrange/order your notes on the main page – where I have a couple hundred personal and business notes – Not convenient. OneNote and gQueues (more importantly for GTD) let me order things within a category. This is a deal breaker.
- gQueues has really smart recurring task settings. The one I use all the time is “repeat this task X days after I complete it” (doing the laundry for example, I need to do that every 7 days or so. I don’t need to do it every Wednesday). Because sometimes I don’t always GTD when I’m supposed to GTD. Keep only has the very dumb “repeat every X days”. I could create a non-recurring task and just continually move it when I’m done, but that’s annoying and doesn’t give you the little dopamine rush of marking it done.
- OneNote has a great web clipper that lets you grab the whole web page, part of the page, can recognize if it’s a recipe and cleans it up, and then ultimately stores the web page all nice and pretty in a note. Keep can only put the link in a note for you. I suppose that’s better than nothing, but it is frequently worthless when I’m trying to search for a recipe and the recipe name isn’t in the link.
So until Keep gets an upgrade (and I have little hope of that. Google seems to release stuff and then be done with it) I’ll keep using OneNote (which is slow, clunky, and doesn’t integrate with my other Google apps) and gQueues (which I actually really kind of love and don’t mind paying the $25 a year for and does integrate nicely with my Google calendar).
Stripe.com has an …interesting… feature where when you ask for a bunch of things – customers, recent charges, etc – it doesn’t return all of them to you, but instead gives you just the first 100. I’d guess it’s a performance issue, but it does mean you have to take a few steps and a few calls when you need all of something.
For example, you can call Stripe to get customers with a call like: /customers. This will only return the first 100 customers to you.
To get the next 100 customers, you have to do a call like /customers?starting_after=<TheIDOfTheLastCustomerYouGotInThePreviousCall>. (And, no, you can’t do customers?starting_after= and leave this blank. Stripe gives you an error for that.)
So to get all your customers, you have to do the first call and then repeatedly do the second call until Stripe tells you there are no more. How do you know when there are no more? One of the last fields Stripe returns to use is “has_more” which is true/false. If there are more records to return, it’ll be true.
And one final gotcha: Stripe doesn’t return a nice neat ID number for those calls. It returns a bunch of data about the customer, and data about their subscription, and data about their plan, and data about their recent charges. So if you’re searching that data looking for the customer ID, you have to make sure you’re looking in the right place and not getting a Subscription ID by mistake. Additionally, there can be multiple has_more entries in there for that extra stuff. Make sure you’re looking at the right one.
The CustomerList function of the StripeX wrapper is a good example of how to make all of this work.
Ran into this rather bizarre problem with a client today. They have a lovely merge document that my program creates for them in Word. It has a header that looks like this:
In some cases, the user will go in and make changes to this document after it’s created. They might delete the last couple paragraphs for example. When they do that, the header in the document will suddenly turn to this:
The merged data disappears and Word reverts to merge fields!
Googling “deleting lines in Word document causes merged data to revert to a merge field” didn’t turn up anything.
Playing around with it, I discovered that it only happened if you deleted to the very end of the document. Curiously, at the end of the document was a single, invisible character. As long as that isn’t deleted, the merged data stays put.