Call us Toll-Free:
Email us
When processing credit card payments, there are several "transaction types" used to identify what action to take with the customer's credit card.

The "transaction type" tells your merchant processor, whether you want to charge the customer's credit card, issue a refund or obtain an authorization code for a specific amount.

People often get confused with all these different transaction types and how they're used, so I wanted to try and clear things up a bit.

With this post, I'll cover the purpose of each "transaction type" and how they're used in the real world.

The same principles apply whether you're processing payments online, offline, using or using any other payment gateway. So it's a good idea to understand how it all works.

Process Flow

Before we dive into transaction types, it will help if we first understand the payment process flow. How money moves from a customer's bank account to yours.

There are lots of tutorials online about transaction types, but I found them all to be way too technical. Here's my attempt of breaking things down, in lamen terms...

Let's meet Dorris.

Dorris is an affluent traveler who loves exotic destinations.

In one of her recent trips to Aruba, Dorris checked-in to the recently renovated Hilton hotel.

The trip was all paid-up in advance, but the guy at the front desk insisted on swiping Dorris' credit card. "This is to cover any incidentals" he said. In other words, help yourself to the minibar. The Cherry Almonds are only $15 a pop...

Dorris hands-over her credit card and the hotel submits an Authorization transaction type, in the amount of $200. The payment gateway responds with a unique authorization code that is saved in the hotel system. Dorris gets her room key and falls asleep as soon as her head hits the pillow. It was a long flight.

A few days later, while shopping at the local market, Dorris suddenly realizes she lost her purse. Credit Cards, driver license and some cash, all gone like dust in the wind.

Dorris gets on the phone with American Express and immediately cancels her credit card. This is the same card she handed to the hotel to cover any potential minibar charges.

A few more days go by. Time flies when you're having fun! It's already Friday and it's time for Dorris to check-out from the hotel.

"I see you have $40 in minibar charges" says the hotel clerk, smiling ear to ear. "We'll go ahead and apply this to the card we have on file. Thank you for staying at the Hilton".

Dorris starts walking towards the door and then she yells "Oh! I lost my card and had to cancel it. I'm sorry".

No problem.

The hotel submits the previously obtained authorization code with a Capture transaction type and the amount set to $40.

Since the authorization was for $200, no matter what happens to the card, how much money is in the account or whether or not the card was canceled. The funds were already reserved and $40 are successfully captured by the hotel's payment gateway.

24 hours later, the transaction settles and funds show up in the hotels' bank account.

There you have it. Now you understand the flow from card authorized to captured to settled.

Transaction Types

Now that we covered the basics, let's drill deeper and review all transaction types:

Authorize (AUTH_ONLY):

Run the card for a given amount and obtain a unique authorization code. The amount will be put on hold and you are guaranteed these funds as long as you use the authorization code in a Capture transaction within 30 days. (How long before an authorization code expires varies by company. Check with your payment gateway)

Customers don't see the authorization as a charge on their statement, but they will see their available funds decrease by the amount you ran the authorization for.

There's an exception here - if the card is a debit card, the transaction will show up in the customer's online statement. Regardless of whether or not the transaction shows up, the rules are the same:

If you don't use the authorization code in a follow-up Capture transaction, the authorization is "dropped", funds returned to the customer's balance and you can no longer use it.


Use a previously obtained authorization code to complete the transaction.

The amount captured can be lower than the originally obtained authorization amount (this is useful in cases like our example where you don't know the total order amount ahead of time)

Authorize + Capture (AUTH_CAPTURE)

This type of transaction is a two-step process. It performs an authorization, immediately followed by a capture.

While this is the most popular transaction type, used by the majority of shopping carts, it is very risky and payment gateways strongly discourage using it (see why below)

Refund (CREDIT):

Credit a previously captured amount back to the customer's credit card.

You can only use this transaction type if the original charge occurred in the last 60 days and the card is still active.

When refunding orders, you can do either a full refund or refund a partial amount.

If you need the ability to issue refunds for older orders, contact your payment gateway provider and ask that they enable Extended credit capabilities for your account.

Void (VOID):

Similar to refund, with the only difference that you are refunding a transaction that took place today (it didn't Settle yet).

When voiding a transaction, you can only void the full amount of the order.

If you need to credit back a portion of the order, wait a day until the payment settles, then issue a refund.

What's wrong with the AUTH_CAPTURE transaction type

The Authorize + Capture transaction type implements the two operations automatically in one call.

To understand why this transaction type is so risky, you need to understand what happens behind the scenes, when a customer is ready to buy and clicks the "Checkout now" button on your website.

The shopping cart software sends a request to your payment gateway, passing the customer's credit card information, amount to charge and transaction type.

The shopping cart software then waits a few seconds to receive an acknowledgment from the payment gateway, indicating the operation completed successfully.

Now, consider something happens along the way and for some reason, the confirmation never comes back. It could be a network issue, timeout, bug or any number of things.

In case your shopping cart software doesn't receive the confirmation back, it assumes the payment did not complete. It is however possible that the payment completed successfully, customer charged, but a timeout occurred before the confirmation message was sent.

While not common, these cases easily lead to duplicate charges (customer will try to place an order again), with the shopping cart system showing a single charge and the customer's credit card statement showing he was charged twice.

To avoid this, always run an authorization first, save the authorization code and then run a capture.

Even if a timeout error occurs, the user will never be double charged. Attempting to capture funds twice using the same authorization code, is not possible.

How SoftwareProjects is using transaction types

When capturing payments:

We always use an Authorization transaction type, followed by a Capture transaction.

You can configure the authorization amount to be higher than the captured amount, to accommodate business models similar to the hotel example.

Note: If your payment gateway is setup to send you email notifications on each action, you will probably see two separate emails per each charge. This is normal. You'll notice the transaction ID in the two emails is the same.

We recommend turning off your payment gateway email notifications and using the shopping cart daily report as a way of keeping track of how well your business is doing.

When issuing refunds:

The system automatically picks a Void or Refund transaction type depending on whether the order was placed today or at an earlier date.

View 4 Comment(s)

Kajabi vs SoftwareProjects

Adrian Singer, September 1, 2010
There's a new kid on the block.

A new system designed to "simplify the deployment of Marketing Campaigns, Sales Funnels, and Product Launches from their current technical complexity down to Drag-and-Drop Ease" (Source:

Kajabi was created by Andy Jenkins (VideoBoss, formerly with Stompernet), Kenny Rueter and Travis Rosser. With this roster, you can bet your Inbox is about to be flooded with emails about how Kajabi is the best thing since sliced bread.

With this post, I wanted to address a question by one of our clients - how does Kajabi compare with SoftwareProjects' own Shopping Cart solution.

Disclaimer: Kajabi is still under development. The information I gathered for this post was collected by analyzing two recent product launches powered by Kajabi, along with a series of emails from the Kajabi team.

First things first: Kajabi is NOT a Shopping Cart

Kajabi is not designed to be an end-to-end shopping cart system.

They will integrate with all popular shopping cart systems, but it's just not designed to be a CRM / Affiliate & Lead Manager / Fulfillment / Backoffice, like SoftwareProjects or Infusionsoft.

You can expect limited built-in support for selling your content, but you're not going to get an executive dashboard that lets you manage the full 360 of your Internet Business.

Membership System

Kajabi offers a built-in membership system, where paying members login to access the content (videos / tutorials) they paid for.

You can customize the membership system skin to some degree and manage members from the admin panel. Think aMember plus a CMS (Content Management System).

At this point my understanding is there's going to be a single backoffice (unlike SPI's Customer's Backoffice and Affiliate's Backoffice), which will support a single product per Kajabai deployment.

Content Delivery

This is one area that keeps being emphasized in all communications I hear about Kajabi.

Still not clear how this is different from hosting all videos and MultiMedia on Amazon S3 or EdgeCast, like everyone are doing.

I'm guessing they use the same underlying technology and just make it easier to use.


Kajabi will not have a built-in Autoresponder.

It is said to integrate with popular Autoresponder services such as AWeber, SoftwareProjects, iContact etc.

Help desk

Kajabi will not have a built-in help desk system.


Kajabi is said to offer "Cloud Computing Technology, (so that) you can publish anything you create with Kajabi instantly to the web - with theoretically infinitely scalable virtual hardware resources".

They seem to be using Rackspace Cloud hosting, to create virtual instances of your site as needed, to accommodate traffic demands.

This sounds very similar to SoftwareProjects' Multi-Homed hosting, where we do what no other company has ever done before and guarantee 100% uptime, no matter what.

Battle Tested

Kajabi successfully powered the product launches of Andy Jenkins' Video Boss and Frank Kern's List Control.

While still under development, the technology has proven its ability to handle launch-day traffic without too many glitches.

Here at SoftwareProjects, we have been powering the majority of the big product launches you hear about, including Magnetic Sponsoring WWN, the ShoeMoney System, ListBuilding, PPC Classroom, Affiliate Classroom, OnlineMLMSecrets and others.

Then again... we've been doing this since 1998.

In Summary

We really look forward to working with the Kajabi team on the integration side.

Where Kajabi shines is simplifying the process of getting an info-marketing product up in no time.

I would describe it as an InfoMarketing CMS with a membership backoffice. It may not have all the bells and whistles, but as long as the integration is straightforward, you get the best of both worlds.


More on this topic:
* Kajabi's home page
* Kajabi Beta Testing portal
* Follow Kajabi on Twitter
* Andy Jenkins blog

View 1 Comment(s)

Why was the payment declined?

Adrian Singer, June 10, 2009
Driving traffic is key, but how do you reduce payment decline rates?

SoftwareProjects Shopping Cart now offers 5 reports to help you trouble-shoot the reasons for declined payments early on, so that you can resolve any issues right away.

1. Payment Decline-rate Trends

Decline rates typically hover around 10%, however they do vary by industry. Monitor your decline-rate trend regularly.

2. Declines by Credit-card Type

A simple misconfiguration with your merchant account provider, can easily cause all American Express or Discover payments to get rejected.

3. Declines by Error Code

Are you getting too many AVS (Address Verification Service) declines? It may be time to review your AVS settings

4. Declines by Country

Helpful in detecting fraud attempts.

5. Declines by Affiliate

Find the affiliates that are generating the highest percentage of declines.


In addition to these reports, you can always view and download a complete list of all payment declines under 'Order Manager' - 'Register'

How to create a ShareASale Deep Link

Adrian Singer, June 8, 2009
ShareASale (SAS) Affiliate Network, lets you redirect the end-user to any page on the merchant domain.

Unfortunately there is no built-in user-interface, but it's pretty easy to set it up.

Login to SAS, click 'Get Links' and get the link for the merchant you're looking to promote.

The link is going to start with

All you have to do is add ?urllink=MYURL at the end of the link, replacing MYURL with the destination link.

No need to include http:// in the destination link and make sure you urlencode it.

Sample valid SAS link, with custom url redirect:

How to create a Commission Junction Deep Link

Adrian Singer, June 8, 2009
The Commission Junction (CJ) Affiliate Network, makes it easy to create product deep-links, allowing you to link to an individual page within a merchant's domain.

When logged in to your CJ account, click on 'Get Links', 'By Relationship', then select the advertiser from the link and click on 'Get HTML'

In the screen that opens up, by default CJ populates the Destination URL with the one provided by the advertiser. You can change that to any URL you want (as long as it's on the advertiser's domain)

If you're building the link programatically, you can use this format:

Replace PID with the publisher ID (usually starts with 2)
Replace AID with the ad ID (usually starts with 1, a longer number)
Replace MYURL with the URL you want to redirect the end-user to (be sure to URLEncode it)

View 13 Comment(s)
Our information-marketing clients sales-process typically follows these steps:

Page 1: Opt-in page
Page 2: Sales letter
Page 3: Checkout form
Page 4: Upsells 1,2,3 etc.
Page 5: Thank you page

How do you prevent users from directly accessing anything but page 1?

You could use cookies or session variables, but the easiest way to block users from directly accessing any "pages in the middle", is to validate using the HTTP_REFERER string (what url the user came from).

If the user is directly hitting pages 2 to 5, or arriving there from any third party sites, the HTTP_REFERER string will not match your domain. You can then redirect the user back to Page 1 and force following the process as it was intended.

The code below does the trick:

= parse_url($_SERVER['HTTP_REFERER']);
$referring_host = $referring_host['host'];
if (
// We got here from a different domain (or bookmark)
// Redirect to page 1
Header("Location: page1");

If you're using the SoftwareProjects Shopping Cart, the above can be implemented with a single call to do_blockdirectlinking


// Include SPI shopping cart

// Block direct access to this page
Pepperjam Network (PJN) is a performance marketing affiliate network, focusing on consumer offers.

PJN offers an easy-to-use RESTful interface, available via simple HTTP GET calls, that allows you to download your stats and transactions in real time.

The SID report includes offer name, SID, EPC, impressions, clicks, commission and creative ID. I wish the date field would have included time as well (for hourly optimizations). On the other hand, it's great that they are including impressions and clicks data (no other network provides this info).

The script below connects to PJN and downloads the SID conversions report:

$loginid ='LOGINID';
$password ='PASSWORD';
$endDate =date("Y-m-d");
// End EDIT

$host = "".

// initialize
$ch = curl_init();

// set url and curl options
curl_setopt($ch,CURLOPT_URL, $host);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);

// execute
$hits = curl_exec($ch);

// close

// Debug
« Previous Posts

About Us  |  Contact us  |  Privacy Policy  |  Terms & Conditions