I wrote recently of the Five Biggest Challenges on an Acquirer side financial payments system implementation. That would seem to call for a similar piece about challenges on an Issuer-side implementation. So, here it is. In both cases, these are not 'academic' lists. They're based on real experiences on successful projects with enterprise-class customers. Hopefully, these comments and insights can help you plan and better manage a similar project.
1. Card/Account Decision-Making - I'm not sure how to best entitle this one...I've worded it here in the widest way possible. I'm referring to the complex of code that needs to determine Approve/Reject/Refer on a card and/or related account based on balances, transaction amounts, limits in force, fees applied, card status and profile, override flags, etc. That's one bullet on my list of five, but easily 70% of your pain if you don't have a ready-made transaction processing engine to handle all that. [For those of you looking for options in this regard, make sure you take a look at Alejandro's MiniGL project, which is designed to encompass many of these issues and to give it a strict accounting take that is sure to interest your finance an auditing teams.] To measure the pain, let's compare to an Acquirer system - the challenge there is to accept the transaction, translate the PIN and get it to the proper authorizer. And, you've got reversal implications aplenty on Debit/EBT. But you're not the decision-maker on the transaction (I'm comparing only purely switched-out transactions here). The issuer takes care of that for you. On an issuer-based implementation, you're the system receiving that request. The bar is set high for you to make conistent, accurate and timely decisions.
2. Prevent Defense - In an Acquirer-side system, you can control much of your own destiny because you the originator of the transactions. On the Issuer-side, it's a different story entirely: you're at the mercy of the Acquirer and the gateway. What I mean by that is that the proper functioning of your in-place issuer application is really - in large part - in the hands of how well acquirers adhere to specs (and common sense, frankly) and how well your gateways prevent illogical occurrences and sequences from sneaking through and biting you. I talk about this at length in an earlier post. I've seen entire issuer-side business models blown up because of loose adherence to specifications by acquirers (the example foremost in my mind is one in which it was super-critical for the issuer to know precisely how much of each purchase request was cashback...and, in practice, we found out that many acquirers can't be bothered to split out that portion). While Prevent Defense is an exercise in continuous improvement, I suggest you make your best efforts to get as much in place upfront as possible. One simple lesson to pass along: always respond with an ISO-level approval to any and all store-and-forward (typically, reversals and completions) requests from the gateway/acquirer. You can figure out how you want to handle illogical requests behind the scenes (an "Approval" to an SAF request doesn't mean you'll necessarily apply it to the account...you need to make a systematic judgment call on each SAF request you receive), but ALWAYS respond in the affirmative to the gateway/acquirer if at all possible (something will need to be seriously wrong with your application to go back with anything but an approval of an SAF). SAF requests queue to you in strict sequential fashion, so until you successfully process that item currently in play, everything else will queue behind it. That can become a bad scene very quickly for you. Play prevent defense.
3. The Pre-Auth / Completion Model - Yeah, this one is going to seem very narrow in scope and I'm sure you're wondering why I bring it up as one of the biggest challenges. There are three reasons. First, the match-up models provided by gateways tend to be, well, esoteric. For example, in one gateway that provides transactions to one of our customers, there are two competing models in play. We can't trust or predict a specific network to use one way vs. another, so in approving and storing the pre-auth, we need to account for the possibility of either of the following match-up methods being used:
The Authorization ID Response Code (ISO Field 38) created by our transaction authorization engine and returned in the pre-auth response to the Network is contained in the corresponding Field 38 of the subsequent completion request.
The Retrieval Reference Number (ISO Field 37) provided by our transaction-authorization engine and returned in the pre-auth response to the Network is contained in the corresponding Field 37 of the subsequent completion request.
To facilitate both of these methods, our engine caches the contents of Fields 37 and 38 along with the card number when logging the results of an approved pre-auth.
Reason number two is that the pre-auth and completion sit at the heart of determining an account's available balance. And it's this balance - not the current or 'ledger' balance - that gets used to make your authorization decisions. So, you don't want to be 'close' on pre-auth / completion mechanics...you want to be right.
Reason number three is that you need to put a methodology in place to handle pre-auths where a completion is never received. This is a perfectly legimate sequence of events. Ever go to gas station, put your card in the pump, then not pump any gas (for whatever reason)? You just initiated a pre-auth without a corresponding completion. In our authorization engine we have a parameter that answers the question "when do you want to expire the effect (on available balance) of this pre-auth if a completion is never received?" Typically, we use 1440 minutes (24 hours).
4. Extract/Settlement Cycle - I don't mean to trivialize Acquirer extract processes, because they have their own special challenges (especially when it comes to discerning the weirdness of some gateway specifications), but it's a more delicate dance on the Issuer side because of balance re-calculating (for recovery purposes, we never allow the transaction engine to update the card balances directly; that task is left to the batch cycle) and the interaction with other balance-affecting systems in the enterprise (if they're in play). Our typical batch sequence undertakes the following pieces of work:
- Selects and ‘extracts’ transaction data from the online transaction database and prepares a reconciliation (‘recon’) file from it.
- Performs (based upon an option selected by the client) either:
A “Self DB Refresh” (i.e., updating the card database directly from the recon file created in the first step.
An DB Refresh from an external source (“External DB Refresh”) by means of a input file provided by the client. In this option, the recon file created in the first step is used by the client as one input (of many) to an enterprise-wide account reconciliation process. In the last step of that process, the enterprise system must create an External DB Refresh file (format specified herein) which will allow then be used as input to update the balances maintained on the card file.
Needless to say, it'll take a while to make sure you've got that all working and updating everything properly. It's super-critical this be right, not close to right.
5. Ongoing Maintenance - Okay, an odd fit here because it's not part of your 'project' per se, but something I'm sticking in here as my "fifth challenge" because I want to make a point. On our Issuer-side implementations, we work really hard to get them "just so." Then, invariably, what happens is that the system gets into production and proves its mettle, and then the marketing people start generating all sorts of good ideas: hey, let's change this, add that, modify this calculation to help the customer, etc. All good and welcome stuff, but: your "just so" app will be tested...can it stand up to repetitive change cycles and increasingly expansive enhancement requests? Unless it has a solid foundation, it won't. That's the premise of Alejandro's MiniGL project: it is designed to provide the user with a solid transactional- and accounting-based backbone upon which you can build your authorization engine.