116 comments

[ 3.1 ms ] story [ 249 ms ] thread
looks cool.

Any A/B test results on conversion rates?

Haven't gotten to that point yet — I originally just set about implementing all the cards in CSS then decided to actually make it into something people could drop in really easily.
This looks great, but any code that attempts to guess the card type using the first few numbers always makes me nervous
Maybe there could be a version that doesn't try to guess the card and uses a generic card background.
Any reason why? It's a pretty straightforward system that card companies use. For example every Visa card begins with a 4, and only Visa cards begin with a 4.
(comment deleted)
Also fun if the last digit would be autofilled based on Luhn algorithm :)
He's not really "guessing" the card type, there's a pretty standard algorithm called the Luhn Algorithm that all credit card companies use when issuing their cards.

The algorithm is public domain and all it does is tell you who issued the card which doesn't seem like an issue to me

It isn't providing a visual for all credit card issuers, though (eg Diner's Club, JCB). Those cards may still be processed correctly (I don't have any way of verifying), but visually treating a correct input like an invalid input isn't going to help conversion much.

Easily solved by simply adding treatments for more card types, and styling the entire card isn't that much more effort than just displaying an issuer logo.

Where this starts to get really interesting (from a slick + branded perspective) is when you start handling gift cards.

Doesn't seem to show the card at all in Safari. Works in Chrome, however.
Which version of Safari are you in? I've tested it in all of the latest versions, but it could easily be broken in an older one.
Looks like it's not Safari's fault - I'm using Disconnect, which blocked the highlightjs lib from loading from yandex.st.
Doesn't work on Lion: Safari 6.1.2 (7537.74.9)
It's confusing because my first instinct was to type my credit card info on the card itself. It took me a few seconds to realize there was a form below it.
Same here, but aside from that, I think this is very neat. Maybe if instead of the card being grayed out before you enter input, it could be entirely invisible. But then the empty space above the form would seem strange at first.
or just the empty recognizable outline of a card (the rectangle with the rounded corners) with no fields. then on first keystroke populate the fields, etc.
I also tried clicking on the card itself. Why not allow that? Otherwise maybe have a hover div to the right of the input fields that only is displayed while any of the credit card fields are active.
Mouse scrolling is broken on that page in IE 11.
FWIW, Chrome blocked your calls to load various JS and CSS files from Yandex because you used HTTP, not HTTPS.
Yep, example does not work for HTTPS users of GitHub. I use HTTPS everywhere, so I'm always defaulted to HTTPS where available.
And in this case, where not available as well.
On the "Before" it says "painful". What is painful about it?

And as someone else said, I also tried entering ON the card rather than below it.

Was thinking the same thing about the "painful" descriptor. I'm thinking it was just a joke...?
Looks nice, but doesn't play well with autocomplete in chrome (tab completing my name didn't show up on the card)
I was about to say the same thing, also doesn't work for credit card number. I autocompleted in a phone number and it didn't show up at all.
That's a lot of code for a sliver of functionality. Does that concern developers these days?
If it increases credit card signups at all, it's worth it.
Interesting experiment! I'd like to see some data on how effective it is versus typical card entry fields.

At first glance I think users would be extremely confused by what is happening in terms of what to fill out, if not full out distracted by the animated card.

Very cool experiment but as others have pointed out it's tough to beat simplicity from a conversion perspective.

Example Amazon:

http://i.imgur.com/aK8K4UY.png?1

Single name on card field Card # Dropdown for EXP

Example Stripe:

https://stripe.com/checkout

Single name on card field Card # Exp / CVC

Less is more when it comes to this point in your conversion funnel.

And the fundamental conversion issue around collecting a CC at this point in cycle isn't usually design, it's trust.

(disclaimer: balanced employee)

There's a direct statistical correlation between less fields and the amount of chargebacks received.

So, yes, less is more for a conversion funnel, but do not assume that it comes without a cost.

"direct statistical correlation between less fields and the amount of chargebacks received"

Spot on and completely agreed.

But in my experience getting that CC at nearly any cost, even @ the end of a long sales process, delivers net gains even measured against returns etc.

For enterprise (eg anybody that can afford it) there are fraud prevention solutions in place to balance the outcome and I've been thrilled watching STRIPE strip away the complexity for "the rest of us".

But point well taken, multiple considerations in testing anything in your funnel and always optimize to highest LTV / KPI.

Point of reference for the above is spending the last ~10 years running CRO projects across dozens of verticals, millions of transactions.

I'd be most interested in seeing the correlation between fewer fields and overall conversions, accounting for chargebacks. Neither conversions alone nor chargebacks alone tells the whole story.
This is really pretty. Kudos to the dev/designers. However, if there's one thing on my website I don't want to be exciting, it's entering payment data.
If you need something easy, nothing is better IMO than Stripe Checkout.

It's insanely easy to integrate, and has an awesome (modal) payment form.

It's a nice display, but as others have said it invites attempts to type on the card itself (which doesn't work). It also doesn't scale with increased font sizes; the card remains the same size and text within it wraps or gets cut off.
Its broken for American Express cards. Amex cards don't do the number as 4 groups of 4, and the security code is on the front.

EDIT: I apologize it works! (note I did try it but apparently mis-typed my first four digits ....)

It worked fine for me on my Amex tests. 4-digit security code showed up in the right place, numbers were grouped correctly.
Did you try it? It gets the 4+6+5 and CVC on the front just right!
Looks gorgeous. I can't help but wonder if people unfamiliar with technology and ecommerce would be deterred by such a form? It might give some users the impression that the website is "copying" the credit card. It would be interested to test the opinions of non-tech savvy users.
I don't know about people unfamiliar with technology, but as someone very familiar with technology, my first thought is that this could easily be a vector for copying the card information!

All you need is to load some encoded image off of a third server to leak card info via a side channel, if your code is underhanded.

I would trust "one line of code" if it's a solution from Google or something, but for something this small I don't see how going with a small third-party solution is secure.

- OP: why not sell this solution to a larger payment processor as a complete solution, so they don't have to develop it themselves?

Well, of course untrusted code dealing with CC info is insecure. That's why this is open source, and you host it yourself. It's just a library. Whose source you can see. Whose source you can compile. With a third-party compiler.

You'd say you'd trust it if it was from Google - in this case, if you use it, it's coming from you, on your server, under your control. I'd trust this far more than a Google-hosted closed-source library - not because I wouldn't trust a Google payment endpoint, but because this is totally under my control, and something from Google isn't.

Not sure what you're talking about with the encoded image. Doesn't make much sense.

There are no real security problems with this whatsoever. The problem is, unsavvy users may think there is, due to the visual resemblance of the onscreen card.

Because it's open source, we can figure out exactly what's going on. OP brings up the point from the users' perspective and they might not trust an interface that looks this flashy.
(comment deleted)
That's a far cry from

  Make your credit card form better in one line of code
and

  With one line of code..
    $('form').card({ container: $('.card-wrapper') });
  You get..
  Animations for 4 different card types
  An intuitive experience for your users
  Pure CSS, HTML, and Javascript (no images)
  100% free and open source
Which certainly could be used by someone who doesn't understand all this.

All I am saying is that for us as developers it is not so simple either. . . we also have to be vigilant.

If somebody who doesn't know what they're doing is writing a CC form, you've already lost. Making app development easier isn't "dangerous" because it allows less experienced people develop applications. You will always have people making mistakes and screwing up security, regardless of the actual ease of development. The more the developer has to do, the more they can screw up.
This is what my point is: as much as the customer has to slow down and say, "Wait a second, is this legit?" - so do we.

That doesn't mean the customer won't conclude it is legit, or that we don't conclude the same thing.

Recall that I had responded to,

>Looks gorgeous. I can't help but wonder if people unfamiliar with technology and ecommerce would be deterred by such a form?

Certainly I personally would be deterred (to an extent) from using this form without at least a cursory audit and verifying the identity of the person who wrote it.

This will naturally be less and less important the more eyeballs this sees. But as a simple tool, perhaps it is not that many.

Do remember that if I were wanting to get my hands on people's credit cards, getting developers to use this kind of script while having a well-hidden side channel (perhaps quite well-hidden - it could somehow encode cc details in the timing delays to a different server, potentially, so that it is not at all obvious that the delays even correspond with the data, it could just look like visualizations getting loaded as the person types) -- then this would be one of the more clever ways I could go about doing so.

I don't see how we're 'arguing' about this? We need to check what we are using, just like customers need to check that this is legit.

I don't really understand your point. The thing about timing channels is absurd - we have the code right in front of us. Right there. It either calls third-party servers or it doesn't, and we can see that. Very easily.

The idea that anyone would successfully steal CC info by putting up an open-source client-side jQuery plugin under his real name is just silly. It's not something that you ever have to worry about in the real world. Sure, I'll concede that if a number of absurdly unlikely things happened, something like this could steal CC info.

Besides, you're missing the point. We're paid to vet this stuff. Customers aren't. Your choice of whether to use this or not harms no one - but customers being scared of an odd-looking CC form is harmful to business, and a valid and interesting point.

(comment deleted)
Because you couldn't just generate a similar image on the server-side if you're already asking for that information?
OP is trying to get a job at stripe, stop making it so obvious he was blending in
Same thoughts!
(comment deleted)
Same here, I mean if I saw this on my paypal account I would kind of worried, looks too "flashy".

But it looks gorgeous for sure and it's probably part of the future.

This is amazing, I love how it handles the CVC even on AmEx. The only way this could be better is to type directly on the card or move the fields above (mobile) or to the side of the card to make them more prominent.

This is great work.

I see no difference. This error is displayed in my console.

  ReferenceError: hljs is not defined
On line 123. Hope this helps, good luck.
If you're looking at this and not seeing any difference between the "before" and "after" versions, it's because HTTPS Everywhere is redirecting all github urls to their SSL version, so http://jessepollak.github.io/card/ redirects to https://jessepollak.github.io/card/ then can't load any of it's javascript dependencies due to the http/https mismatch.

Bonus points for the form still working right through all of that.

Same for me, the yandex domain they're loading hljs from seems to be blocked. The hljs call is in the same script block as the line to initiate the fancy stuff, so it fails and that line's never reached. Paste this into the console to run that manually:

    $('.active form').card({ container: $('.card-wrapper')})
yandex was being blocked by Disconnect for me
Great, so instead of worrying about someone peeking over my shoulder, I now have to worry about the person 30 feet away, with the size of that font.
Pretty nice, pretty similar to JS Skeuocard (http://kenkeiter.com/skeuocard/)
I actually like this one a lot better. Not being able to enter information onto the credit card itself was frustrating.
There's nothing painful about a regular form with the minimum amount of fields.
It doesn't seem to be working to tab between fields in Chrome. Once I've entered the expiration date it just fails to go to CVC or let me tab into it. had to use the mouse to switch fields.
It is validating that the card is in date, if you enter a date that is in the future, it will let you tab to the ccv field.
I really want to like this because the design and functionality of is very cool. Like others I tried to start typing on the card so there is definitely an element of confusion that isn't there with a normal form. The last place I want to risk any confusion is the stage at which the customer is trying to pay me! A variation of this where you could type on the card might be interesting.
This looks great and without using images - kudos!