Collapse Menu
Docs Home
Developer Tools
Contact Support

Access the Library with Javascript

Overview

This article describes how to access the Store Builder Library directly from Javascript utilizing available public methods.

An advanced alternative to using HTML Markup directives is to access the Store Builder Library directly from Javascript utilizing available public methods

Store Builder Library is a wrapper around a set of private APIs that allow you to manipulate the cart contents for a given visitor. All calls made to the Library are converted into API requests and published to the backend expecting a response with current cart contents and order parameters – the "order object." Given sophisticated cart population logic, various cross-sell and upsell scenarios, and other features of the platform, each request might result in significant changes to the order object. We recommend that you rely on the most current data after each request and avoid caching responses. 

All requests to the Library are made in the form of the Session Object. The library converts the Session Object to internal API directives. Use the Session Object for passing order details to the Store without requiring the use of a secure payload.

For interactive examples, see FastSpring Examples.

Session Object

The Session Object is a standard Javascript object which contains directives for the Store Builder Library. The Session Object may contain the following fields:

  • coupon – A string that must contain a valid coupon. If the string passed is empty, the coupon is removed from the cart. 
  • products – An array of objects, each of which represents a valid product. These must contain the Product ID and quantity. To place a product in the cart, pass any non-zero quantity. To remove a product from the cart, pass the corresponding quantity as 0. Example: {'path' : 'example-product', 'quantity': 1}.
  • checkout – Accepts either true or a SessionID string obtained by making a POST to the /sessions endpoint of the FastSpring API. 
    • If you pass “true”, the consumer is redirected to checkout after performing other operations. 
    • If you pass a Session ID, the library ignores all other fields in the Session Object redirects the consumer to checkout.
  • clean – A boolean that cleans the session for the consumer after redirecting them to checkout if set to “true”. This parameter is only valid if "data-continuous" is set to “true” when initializing the Library. Passing "clean":"true" temporarily changes “data-continuous” to false and ensures that the consumer will return to a "clean" cart after attempting a checkout.
  • reset – A booline which resets the session immediately if set to true.
  • secure – A string for live storefronts, or an object for test storefronts, which contains a secure payload. See Passing Sensitive Data with Secure Requests.
  • tags – Any valid Javascript object. When you pass data via tags, it will be made available to you via webhooks and server events. For example, tags can be used in secure payloads to change a product's price for a specific consumer or for price A/B testing. For more information, see Passing and Capturing Custom Order Tags and Product Attributes.
  • language – A string containing a two-letter ISO language code to force a different checkout language.
  • country – A string containing a two-letter ISO country code to force a different checkout country.
  • paymentContact – An object representing "tentatively" known visitor details. Applies unconfirmed consumer information to the order. Input fields are not hidden during the checkout process. To pass "known" and "confirmed" information, refer to Passing Sensitive Data with Secure Requests. The structure of this object is:
    {  
    	"email":"email",
    	"firstName":"firstName",
    	"lastName":"lastName",
    	"company":"company",
    	"addressLine1":"addressLine1",
    	"addressLine2":"addressLine2",
    	"city":"city",
    	"region":"region",
    	"country":"country",
    	"postalCode":"postalCode",
    	"phoneNumber":"phoneNumber"
    }
    			
     
  • recipient - An object that represents "tentatively" known gift recipient details. This applies unconfirmed recipient information to the order, and automatically selects the Gift Purchase check box, but does not hide input fields during the checkout process. To pass "known" and "confirmed" recipient information, refer to Passing Sensitive Data with Secure Requests. The structure of this object is:
    {
    	"email": "recipient@fastspring.com",
    	"firstName": "firstName",
    	"lastName": "lastName",
    	"address": {
    		"addressLine1": "Address Line 1",
    		"city": "City",
    		"region": "California",
    		"postalCode": "93101",
    		"country": "US"
    	},
    	"memo": "Happy Birthday!"
    }
    			
     

Once created, the Session Object is usually passed to the Library by utilizing the fastspring.builder.push() method:

var s = {
	'reset': true, // reset the cart and session (will remove everything added to the cart or passed to the session prior to this)
	'products' : [
					{
						'path':'example-product',
						'quantity': 1 // add product "example-product" to the cart with quantity "1".
					}
	],
	'coupon': 'YOUR10OFF', // apply coupon to the order
	'checkout': true // once all of the above is done redirect to checkout
}

fastspring.builder.push(s); // call Library "Push" method to apply the Session Object. 
If the product specified in the Path has a default quantity behavior set to locked or hidden, you cannot override the quantity using the session object. However, you can override it using a secure payload. You can change the Product’s default quantity behavior by clicking Pricing in the product details page,  or by posting to the /product endpoint of the FastSpring API.

Initialize the Library with the Session Object

The Store Builder Library makes an initial request to the FastSpring backend as soon as it’s initialized. Sometimes your website flow requires you to pass data to the Library before making the initial request. 
To enable this behavior, place a Session Object into the variable named "fscSession" before initializing the Library:

<script>
var fscSession = {
	'reset': true,
	'products' : [
					{
						'path':'example-product',
						'quantity': 1
					}
	],
	'coupon': 'YOUR10OFF'
}
</script>
<script
	id="fsc-api"
	src="https://d1f8f9xcsvx3ha.cloudfront.net/sbl/0.8.3/fastspring-builder.min.js"" type="text/javascript" 
...

If you define the "fscSession" variable before the API is loaded, the contents will be executed with first priority. In this example, the session will be reset (breaking continuous mode), the "example-product" product will be added to the cart, and a coupon will be applied immediately upon loading the library.
 

If the product specified in the Path has a default quantity behavior set to locked or hidden, you cannot override the quantity using the session object. However, you can override it using a secure payload. You can change the Product’s default quantity behavior by clicking Pricing in the product details page,  or by posting to the /product endpoint of the FastSpring API

Public Methods Exposed by the Library

After the Library is loaded, your web page can access it using public methods. To take advantage of the latest methods, ensure that your page is using the most current Store Builder Library version. To update the version that your page uses, update the URL in the src directive of the script that loads SBL (e.g., https://d1f8f9xcsvx3ha.cloudfront.net/sbl/0.8.3/fastspring-builder.min.js )

  • fastspring.builder.push() - the core method. Each call to this method results in an updated order object response from the FastSpring backend. If you register callback functions when initializing the Library, your functions will be called with corresponding data on each request made. See Getting Started with Store Builder Library for more information.
  • fastspring.builder.push() - takes a Session Object payload as input and applies data to the session
var s = {
	'products' : [
					{
						'path':'example-product',
						'quantity': 1
					}
	],
	'coupon': 'YOUR10OFF',
	'checkout': true
}

fastspring.builder.push(s);

  • “paymentMethod”:”paypal” - you can optionally pass this instead of “checkout”:”true” to skip the Storefront and send the consumer directly to PayPal.
  • fastspring.builder.checkout() – Expects either no input or a session ID obtained after pre-creating a session using the server API.
  • fastspring.builder.payment("paypal") – Launches the checkout and skips the Storefront to send the consumer directly to PayPal.
  • fastspring.builder.viewCart() - When the Popup Cart is enabled on the Storefront's Settings, this method launches the Popup Storefront and opens the cart directly instead of the checkout page.
  • fastspring.builder.promo(code) – Takes the coupon code as input, and applies it to the cart.
  • fastspring.builder.postalCode() - Takes the consumer's postal code as input, and applies it to the session to calculate sales tax. This is only applicable when the address is within the US. This method allows you to display sales tax amounts for US orders on your page before triggering the checkout.
  • fastspring.builder.taxId(id) - Takes the consumer's GST ID or VAT ID as input, and attempts to validate it in conjunction with the consumer's country (detected via geolocation or set by fastspring.builder.country()). If the ID is validated successfully, it is applied to the session, and no VAT or GST is applied. 
  • fastspring.builder.update(productId,qty) – Takes a product ID and quantity as input, updates specified product's quantity in the cart. Example: ('product-path',1)
  • fastspring.builder.add(productId) Takes product ID as input, adds the product to cart.
  • With this method, the product’s quantity in the cart is initially set based on its default quantity in the product details.  
  • fastspring.builder.remove(productId) – Takes product ID as input, removes the product from the cart.
  • fastspring.builder.tag({"key":"value","key2":"value2"}) – Takes one or more key and value pairs as input, applies tag(s) to the session.
    • You must supply the key and value pairs using valid JSON formatting, as in the example here.
    • The sum of the number of characters supplied for the key and the value must not exceed approximately 4,000 characters. 
  • fastspring.builder.reset() – Resets the cart immediately, without input.
  • fastspring.builder.clean() – Resets the cart after redirecting to checkout without input. This effect lasts until the page is refreshed; for practical intents, it temporarily changes "data-continuous" to "false".
  • fastspring.builder.secure(securePayload, secureKey) – Takes a secure payload (encrypted or plain text, depending on the storefront’s state) and secure key as input, then applies secure payload to the current session. See Pass Sensitive Data with Secure Requests.
  • fastspring.builder.authenticate(securePayload, secureKey) – Takes a secure payload (encrypted or plain text, depending on the storefront’s state) and a secure key as input. If the payload contains a consumer account id, this method redirects the consumer to the account/subscription management page.
  • fastspring.builder.recognize({paymentContact object}) – Applies unconfirmed consumer information to the order. It does not hide input fields during the checkout process.
  • fastspring.builder.recognizeRecipients({recipient object}) - Applies unconfirmed gift recipient information to the order, but does not hide input fields during the checkout process.
  • fastspring.builder.country(countryCode) – Sets the checkout country to the supplied "countryCode". The countryCode is a two-letter ISO country code such as “US” or “DE”. 
  • fastspring.builder.language(language) – Sets the checkout language to "language". The “language” is a two-letter ISO language code such as “es” or “de”.
If the product specified in the Path has a default quantity behavior set to locked or hidden, you cannot override the quantity using the session object. However, you can override it using a secure payload. You can change the Product’s default quantity behavior by clicking Pricing in the product details page,  or by posting to the /product endpoint of the FastSpring API

Public Methods Callback Function

All public methods accept the callback function. This function is called after the primary request has been made. This approach differs from the generic "data-data-callback", which is called only once for a request chain. This means that if multiple requests are made, only the last request returns the order object. By using the callback function in conjunction with a public method, the callback function receives the order object that resulted from the call, giving you more flexibility around integration. The callback function is always passed as the last parameter. 

	 fastspring.builder.add("example-product-1", function(data){
 
	console.log("Added 'example-product-1' and it resulted in the following order object", data);
 
});
	
The fastspring.builder.checkout() method does not accept a callback function as a parameter due to its finite nature.

Errors

Some requests might result in errors received from the server. All errors are fatal – if an error occurs, processing stops, and the server returns an error response. The easiest way to handle errors is to declare an "error callback" function when initializing the Library.

In case of an error, the body of the response will contain one of the following "codes":

  • session-payload-invalid – Could not understand the data in the "session" parameter.
  • session-expired – Serialized session data has expired.
  • empty-session – Tried to finalize / checkout a session with no items.
  • path-not-found – Couldn't find the product variation referenced in session data.
  • envelope-invalid – Error parsing secure payload

Add a Product

  • quantity-invalid – Passed an invalid quantity value.
  • not-removable – The product is not allowed to be removed from the session.
  • path-not-found – Could not find the product variation.

Field Validation

Starting with Store Builder Library (SBL) version 0.7.9, the payload of the order object response includes an array named fields. The "fields" array provides up-to-date validation details regarding specific fields of the order session data. You can also optionally send the field validation data to your dedicated script via the data-validation-callback.

The following order session fields are validated:

  • firstName (validation only checks whether or not this is present)
  • lastName (validation only checks whether or not this is present)
  • country
  • email
  • postalCode (validation only occurs when country = "US")
  • taxId
  • language
  • coupon
  • account

Each object in the fields array may consist of the following items:

NameTypeDescription
fieldNamestringthe name of the current field in the array
required Booleanindicates whether the field is required to process an order
providedBooleanindicates whether or not you have provided value for the current field
transportstringonly appears when provided is true;

indicates the method of submitting the session data via SBL:

"secure" for secure payloads; otherwise, "recognize"
validBooleanonly appears when provided is true;

indicates whether or not the provided value is valid
errorobjectonly appears when valid is false
error.codestringerror code regarding the current field
error.messagestringverbose error message regarding the current field

 

Error Codes and Messages

  • country-invalid - Country Code is not valid
  • email-invalid - Email is not valid
  • postalcode-invalid - Postal Code is not valid
  • taxid-invalid - Tax ID is not valid
  • language-invalid - Language passed is not valid
  • coupon-invalid - Coupon Code is not valid
  • account-invalid - Account ID is not valid 
If an invalid country is passed via fastspring.builder.push(), fastspring.builder.recognize(), or fastspring.builder.secure(), the invalid value is discarded and geolocation is used to set the order country. However, fastspring.builder.country() can result in this field validation error. 

Example of the "fields" array

   "fields":[  
      {  
         "fieldName":"firstName",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"lastName",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"country",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"email",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"postalCode",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":false,
         "error":{  
            "code":"postalcode-invalid",
            "display":"Postal Code is not Valid"
         }
      },
      {  
         "fieldName":"taxId",
         "required":false,
         "provided":false
      },
      {  
         "fieldName":"language",
         "required":false,
         "provided":false
      },
      {  
         "fieldName":"coupon",
         "required":false,
         "provided":false
      },
      {  
         "fieldName":"account",
         "required":false,
         "provided":false
      }
   ],  

Order Object Response Fields

{  
   "currency":"USD",
   "country":"US",
   "taxExemptionAllowed":false,                    // based on "country", indicates whether or not it is possible to supply an ID (e.g. VAT ID, GST ID) and remove tax from the order
   "taxExempt":false,                              // indicates whether or not the current order is exempt from tax
   "total":"$6.17",                                // order total without tax
   "totalValue":6.17,                              // order total value (without the currency symbol), without tax
   "tax":"$0.45",                                  // total amount of VAT or sales tax
   "taxValue":0.45,
   "totalWithTax":"$6.62",                         // this price will be charged; it accounts for quantity, discounts and unit price.
   "totalWithTaxValue":6.62,                       // order total with tax but without the currency symbol
   "discountTotal":"$6.17",                        // total discount for the order
   "discountTotalValue":6.17,
   "discountTotalPercent":"50%",
   "discountTotalPercentValue":50.0,
   "taxPriceType":"added",                         // "included" or "added"; indicates whether tax is included in the subtotal or added to the subtotal
   "taxType":"US",                                 // "US" (US state/local sales tax) | "VAT" (Value Added Tax, e.g. in the EU) | "GST" (Goods and Services Tax, e.g. in Australia) | "JP" (Japan's Consumption Tax)
   "taxRate":"7.25%",                              // the tax rate applied to the current order if taxExempt is false, expressed as a percentage; "0%" if unknown (e.g. country / postal code have not been supplied)
   "groups":[  
      {  
         "items":[              
            {  
               "selected":true,                    // indicates whether the item is in the order
               "path":"example-product-2",         // internal product id / product path
               "pid":"example-product-2",          // internal product id (backward compatibility)
               "quantity":1,                       // quantity of the item
               "price":"$12.34",                   
               "priceValue":12.34,
               "priceTotal":"$12.34",              // quantity multiplied by item's unit price
               "priceTotalValue":12.34,
               "unitPrice":"$6.17",                // unit price of the item
               "unitPriceValue":6.17,
               "unitDiscount":"$6.17",
               "unitDiscountValue":6.17,
               "discountPercent":"50%",
               "discountPercentValue":50.0,
               "discountTotal":"$6.17",
               "discountTotalValue":6.17,
               "total":"$6.17",                    
               "totalValue":6.17,
               "priceWithoutTax":"$6.17",          // when net pricing is enabled, this string indicates the price of the current item without applicable tax
               "priceValueWithoutTax":6.17,        // when net pricing is enabled, the numeric value of the price before tax (with no currency symbol)
               "quantityEditable":true,            // indicates whether or not visitor is allowed to change the quantity of the item
               "removable":true,                   // indicates whether or not visitor is allowed to remove the item from the cart
               "image":"https://d8y8nchqlnmka.cloudfront.net/VTetZH1kQD8/r7kju5MHTRQ/example-product-2-box.png"",
               "display":"Nest",                   // product display name; show this to the visitor
               "sku":"skuex2",
               "description":{  
                  "summary":"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.",
                  "full":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque vel mi quam. Etiam non purus et est volutpat aliquet. Sed a urna nec nisi scelerisque maximus. Aenean vitae cursus augue. Phasellus eu finibus ex. Morbi auctor nec leo vel suscipit. Sed non condimentum elit.",
                  "action":"Buy Now"
               },
               "pricing":{  
                  "quantity":"allow"               // allow: visitor is allowed to change quantity. lock: visitor is shown quantity, but can't change. hide: visitor can't see quantity  
               },
               "discount":{  
                  "reason":"Halloween Special!",
                  "coupon":"HALFOFF",
                  "data":{  
                     "tiers":[  

                     ],
                     "discountPath":null,
                     "discountDuration":null,
                     "percentValue":50.0
                  }
               },
               "groups":[                          // if item contains upsells, options, choose-one and choose-many configuration parameters they will appear here; the format is the same as the parent item.  

               ],
               "productFormat":"digital",
               "priceWithoutTaxAndDiscounts":"$12.34",   // when net pricing is enabled, this string indicates the unit price of the current item, before tax and any coupon discounts
               "priceValueWithoutTaxAndDiscounts":12.34, // when net pricing is enabled, the numeric value of the unit price of the current item, before tax and any coupon discounts (without the currency symbol)
               "product":"example-product-2",
               "variation":"example-product-2",
               "attributes":{  
                  "ProductAttributeKey1":"ProductAttributeValue1",
                  "ProductAttributeKey2":"ProductAttributeValue2"
               }
            }
         ],
         "driver":"yourexamplstore-popup-yourexamplestore",  // explains why the group is present in the response; may list a product path if the group is a cross-sell group for a specific product, or may list the Storefront URL if the group is associated with the Storefront
         "required":false,
         "type":"add",
         "selections":true                         // indicates whether or not this group of items contains selected items
      },
      {  
         "display":"Customers also purchased...",  // some group items will have their own display names; this means that items in the group have a header (note:  this line has been added to the example for illustrative purposes)
         "items":[  
            {  
               "selected":false,
               "path":"SystemExtension.eds",
               "pid":"SystemExtension.eds",
               "quantity":1,
               "price":"$4.95",
               "priceValue":4.95,
               "priceTotal":"$4.95",
               "priceTotalValue":4.95,
               "unitPrice":"$4.95",
               "unitPriceValue":4.95,
               "unitDiscountValue":0.0,
               "discountPercentValue":0.0,
               "discountTotal":"$0.00",
               "discountTotalValue":0.0,
               "total":"$4.95",
               "totalValue":4.95,
               "priceWithoutTax":"$4.95",
               "priceValueWithoutTax":4.95,
               "quantityEditable":false,
               "removable":true,
               "image":"https://d8y8nchqlnmka.cloudfront.net/VTetZH1kQD8/vedymJXwSBY/download-icon-small.jpg"",
               "display":"Extended Download Service",
               "description":{  
                  "summary":"Extend the availability of your download today! By default, all file downloads are available for seven days from the date of the purchase. However, if you purchase EDS, all products in this order that have file downloads will be downloadable from FastSpring for one year from the date of your purchase."
               },
               "pricing":{  
                  "quantity":"hide"
               },
               "groups":[  

               ],
               "priceWithoutTaxAndDiscounts":"$4.95",
               "priceValueWithoutTaxAndDiscounts":4.95,
               "product":"SystemExtension.eds",
               "variation":"SystemExtension.eds"
            }
         ],
         "driver":"yourexamplestore-popup-yourexamplestore",
         "required":false,
         "type":"add",
         "selections":false
      }
   ],
   "coupons":[                                     // coupon applied to the order  
      "HALFOFF"
   ],
   "payments":[                                    // list of payment options available for this order; currently the selected payment method cannot be pre-populated via SBL  

   ],
   "fields":[                                      // see Errors:  Field Validation above  
      {  
         "fieldName":"firstName",
         "required":true,
         "provided":false
      },
      {  
         "fieldName":"lastName",
         "required":true,
         "provided":false
      },
      {  
         "fieldName":"country",
         "required":true,
         "provided":false
      },
      {  
         "fieldName":"email",
         "required":true,
         "provided":false
      },
      {  
         "fieldName":"postalCode",
         "required":true,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"taxId",
         "required":false,
         "provided":false
      },
      {  
         "fieldName":"language",
         "required":false,
         "provided":false
      },
      {  
         "fieldName":"coupon",
         "required":false,
         "provided":true,
         "transport":"recognize",
         "valid":true
      },
      {  
         "fieldName":"account",
         "required":false,
         "provided":false
      }
   ],
   "gift":false,
   "postalCode":"68512",
   "availablePaymentMethods":[                     // array listing which payment methods are currently available based on session detail such as cart contents and order country
      "wire",
      "paypal",
      "card",
      "purchaseorder",
      "amazon"
   ],
   "language":"en",                                // current session language (based on browser default or user selection)
   "expires":1550961521056,                        // expiration date of the current session
   "messages":[  
   ],
   "selections":true,
   "tags":{                                        // order-level custom tags
      "key1":"value1"
   },
   "creationTime":0,
   "serial":"H4sIAAAAAAAAAJWURbKE2BZFB0RUoIk0qoG7a9LD3S7wkKjB_5zCb54dp7W22KCsgF_te7fM_NhV8-Ef2VH9gyEog2AY-t_HgNSpbxvJ7Kg6ru2QOTVkmceo4nziSaKewXIuKfD8Ye3wtj-AnxWbQFUoLBRqkV0wEUdzd29qPGmYYCUtrtwwgjUz4V5aDbNnLnsTXSkH1IIS0IKv-t_nOxushE7dxQF_WWgbjSbxGm52V1hB6baDrEOfv4PS_CNGJNP7DbdCk57TbTBnUaD2pG_DTQBo_bcuSO4G_ldT4u4OnyvKLZksi1YUOdOVeP4YbbvXGYEdK44-cdD2O7vThChWMqTzKNz077biJ4peXxUvEAgixmtGxE13hCNKW1MzXYO72JvYQDWjYrOHeGBAWil3C3m8keAU7_gdqTqo28iHYHyym1XRIidKagjivHjvDpqfWsldaRayAmb5ujCWcsZdS7WaquFAUo1Ias051PBo0r4rlglcCQjOnn9xt7dcvlXTa-riakbVDoNuWCT76OHZ4mrEBeYcYUJ8OzrxJijNX7Q_P1UiXYCNvk8_f1mMNqaVoW_DbTWomx18f2xtWWdAcH45ZIbhSj4aBaXgNjhouFz9w7YU_j_4-yjOEq5zxWoZL9ZmR5KE_XHDC10ZyeC4T09G2gL3_TysAZrP5XEvraGLsGpn-AsAtmZsUicqcFWG617DPQ2uejRJlETHodyweHS7JnCPI3ZiwT8PvgEKHfWQ0AxutpddWCd7LpDipzsonRU7Lz9ne98QGZMJbiZO6LuhWj0w1dyXw1HCNQ6mQ2IvvPAuOv2cdIOQlGwvJplZLSMG_csJVgsFXev2cbuHJfMjKh70RS0EHqTSsUWPMhqIeQZJkryjKdB4TJQPd-CvwRo7GxDb1xKU9Phm-ydZSUGfBNZTbk6DGhGPBDxMOkAp-0y2EUWzU1XN1tJoc6_TawRou1JOnOSJzB_acsJkYcUzu_2VL6VGwbWCSSSu0gGDFjfjiwNF633hTLsCPLdeF7rmhXUXoAjBQyTjdIpEF35d_tq6jR8EYTr7aEjeLBHpdCbIOjzSSbyYPlaCm3lOeB7V3qVP1CTcbHIGrQBM7zncZuOiBvwDn_3gGXCUrXvA4sukx_UHueU8UY9qrcVyqjIjyrHcbxQRs_Zv7sxRdbSwnXh5llGS9IoJIeSXNQQMF1Ify1LOlkD77rGPCiEmBOH43IG-6Oge0qhXW1Ofsl53SY2qsKTEfUJQHTvW5XX3XEFVGPhDxb-bxlDD4TeNmiNGJl23rp0fNj2YFOP7CsglUptgoXRZABqxjZySIllAngOO9Zcr03UMRIyxlzuTgi7_lf0u0wp3UTwlhzr58FRxU7LuOQ7bHPDj77DvTJptfDaH-AOs4mZeXNhjN6i9Rfo2hk3L6FtcwzGqyllp9l30HTXOMc9SUvskAhHG03yGdHqHlOQgYp_1Ql6BeBP1at3yDIlJP83cIoFwHfZTNZobljT_IDpQ0fTMpSUvXN4i3n3q92QXVDAbXgANjhoiB_aQyngaagaeAz2ojFX24hs8n2hUD1OU220aU3lPJA1PRTR9MH9rv6PogJovgQNVLETLWPBiN1hYqZSwqBWmceSghMJWW0RY9G_rQo0s2-NzXQO2C0frUkmR--wuzR51NyyET-NsSChFQyN6h6Yzc743hkcq1QWb4tNuWf0BXFfo7oc1JySThqppcnxRP5DRZmS7-1kcIslK1XR1Vj2uOe4Mk9VpRtLXjHtNpIt6i14JSGZpvjVYLEekO9eKng_EWSYqRGKkVZBsUkVYpXhHwc6iL7Lwoie_oeNRUOO2HvQFV7GDyFyzs9hsIFqXEo2LIDqsZJPZApz6k1FKX61WMkTdVX-uG-HQNlUukW6fcQzHeb6hc8IJ0CG3Qu_7y2ToLIc3-czdjBP--6h3_phveaf5nOpyXQUxM0ui_Md51gR2hHqEeMiFrZQun_mQSGCahDI0CstT70PizaD0btD6zZMQ1Tfqjf1ex_6xK_kWfa-LS_6xBo3bCZ3hAM3ayVjVmnn5QS7MnDiH4v2mOLUl47w1mtPe5PEbbwnvX8qhtuBUsEqGZTVq-lu7KREt2PIp_Yaqz8G201oZpvVyMK8ukb-ljqgnGxc2ZjJo_iJC1yb5V58TSYbwllDw3ygE4wkLt0jiti7q0Z_tAmvcldeYy82j4i4ZDKVhhuLSBvTHDfIN5nSqMSXiuGM0rXx8LPBC2H8pcpgQTb5dQ-MsaileOCIHX1XSGjLF5lbBVoAbjDj_NII4YFhtPqwr5vIqmK88_Wb7tZILSablfWMOKeOK9odn2FaMCOT0gFhrOh-QQK4O_c5RSAb2VhflY5jZRQpnq5lfWc3jJCjdTiww7ttwVWMycH5jd7I2DO70cYZiKd3WmsF3dNbfO1N70KHxtEmJxy5mUbm2Rh5ahsfiWcKICR6sSO74ibFYWsuf4bK6nf39-ZuZyC7mCEuo5qmjZlk2NfUQThuotgWHLg90aIEyt5eqId7aGUzff_8HiXdKk80JAAA"
}

Try FastSpring

Get a free account and see why FastSpring is the ecommerce partner of choice for software providers around the world. Try our full-service ecommerce solution today to unlock revenue growth for your online company.