{"count":15,"next_page":null,"page":1,"page_count":1,"per_page":30,"previous_page":null,"articles":[{"id":38492246374673,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/38492246374673.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/38492246374673-API-reference-A-Z","author_id":21855521203985,"comments_disabled":true,"draft":false,"promoted":false,"position":0,"vote_sum":-1,"vote_count":7,"section_id":32544342993169,"created_at":"2025-08-28T07:47:53Z","updated_at":"2026-09-12T13:30:42Z","name":"API reference A–Z","title":"API reference A–Z","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T13:07:07Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>To open our API reference in a new tab, click <a href=\"https://digistore24.com/api/docs/index.html#\" target=\"_blank\" rel=\"noopener noreferrer\">here</a>.</p><iframe src=\"https://digistore24.com/api/docs/index.html\" width=\"121%\" height=\"9850\" style=\"border: 0;\">\n</iframe>","user_segment_ids":[]},{"id":32643580478353,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32643580478353.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32643580478353-Affiliate-attribution-via-javascript","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":0,"vote_sum":16,"vote_count":40,"section_id":32544506908561,"created_at":"2025-02-13T12:18:45Z","updated_at":"2026-09-27T13:09:25Z","name":"Affiliate attribution via javascript","title":"Affiliate attribution via javascript","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-02-13T14:29:15Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>Ususally it's enough to just add the tracking code to your salespage as found in the Digistore backoffice under: <a href=\"https://www.digistore24-app.com/vendor/settings/promocode\" target=\"_blank\" rel=\"noopener noreferrer\">Settings - Promocode for Salespage</a></p>\n<p>The code is e.g.:</p>\n<p><code>&lt;script\n    src=\"https://www.digistore24-scripts.com/service/digistore.js\"&gt;&lt;/script&gt;</code><code>&lt;script type=\"text/javascript\"&gt;</code><br><code>digistorePromocode( { \"product_id\": 12345,\n    \"adjust_domain\": true } );</code><br><code>&lt;/script&gt;</code></p>\n<p>12345 is the id of your product.</p>\n<p>The js code modifies all regular A-HREF-Links and append the affiliate to the url.</p>\n<p id=\"h_01JKZKWDEP5YS201WT3Z07PD94\"><strong>Example:</strong></p>\n<p>Salespage url is: https://www.some-domain.com/salespage/</p>\n<p>Checkout button on the sales page is: </p>\n<p><code>&lt;a href='https://www.checkout-ds24.com/product/12345'&gt;Buy\n    now&lt;/a&gt;</code></p>\n<p>The affiliate advertises: https://www.some-domain.com/salespage/?aff=some_affiliate_name</p>\n<p>When a buyer follows the affiliate's link, then the js code above changes the checkout button url to: https://www.checkout-ds24.com/product/12345?aff=some_affiliate_name</p>\n<p>That's the regular workflow.</p>\n<p>However, if you use a custom js button like:</p>\n<p><code>&lt;a\n    onclick=\"windows.open('https://www.checkout-ds24.com/product/12345')\"&gt;Buy\n    now&lt;/a&gt;</code></p>\n<p>Then our js cannot identify this button and cannot append the affiliate.</p>\n<p>The solution is to use our js function: <code>digistoreAppendAffiliateToUrl</code><code>( string url ) : string</code></p>\n<p>This function appends the affiliate to an url.</p>\n<p>In this case use a button like:</p>\n<p><code>&lt;a onclick=\"windows.open( digistoreAppendAffiliateToUrl(\n    'https://www.checkout-ds24.com/product/12345') )\"&gt;Buy\n    now&lt;/a&gt;</code></p>","user_segment_ids":[]},{"id":32486158815121,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32486158815121.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32486158815121-How-to-generate-an-API-key-interactively","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":0,"vote_sum":0,"vote_count":4,"section_id":32477029106449,"created_at":"2025-02-07T14:29:09Z","updated_at":"2026-09-21T02:36:44Z","name":"How to generate an API key interactively","title":"How to generate an API key interactively","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:45:15Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>If you publish an application you might want to enable users to generate an API key easily.</p>\n<p>The procedure is described here. For the creation the user of your app will be forwarded to the Digistore24 page - and afterwards back to your app. Data is transferred via GET parameters.</p>\n<p><strong>Preparation: Generate a developer API key</strong></p>\n<p>You need the developer key to enable your users to generate themselves an API key interactively. The developer key is needed for steps 1 and 2 mentioned below.</p>\n<h2 id=\"h_01JKGBWBP4K841QPPMN965469Z\">Step 1: Create a developer key</h2>\n<ol>\n<li>In Digistore24, go to the page <a href=\"https://www.digistore24-app.com/vendor/settings/account_access/api\" target=\"_blank\" rel=\"noopener noreferrer\">Settings &gt; Account access &gt; tab: API keys</a> (in the vendor view)</li>\n<li>Click on “New API key”</li>\n<li>Choose “Developer” for the “API permissions”</li>\n<li>Click “Save”. The developer key will be shown in the field “API key” then</li>\n</ol>\n<p>Execute step 1 and 2 for every user account of your app that shall be connected with Digistore24.</p>\n<h2 id=\"h_01JKGBWJB2M6DBB46C249Z7J0N\">Step 2: Initialize API key creation</h2>\n<p>Call up the API function <a href=\"https://digistore24.com/api/docs/index.html#/API%20Key%20Management\" target=\"_blank\" rel=\"noopener noreferrer\">requestApiKey()</a>. Use the developer key for it.</p>\n<p>Pass these parameters:</p>\n<ul>\n<li>\n<strong>permissions</strong>: The permissions of the user's new api key, e.g. writable</li>\n<li>\n<strong>return_url</strong>: After api key creation the user is redirected to this url in step 3.</li>\n</ul>\n<p>The API call will return:</p>\n<ul>\n<li>\n<strong>request_token</strong>: Store request_token for Step 3.</li>\n<li>\n<strong>request_url</strong>: Redirect the user to the request_url. The user will authenticate and create an own API key there. You will get the API key in step 3.</li>\n</ul>\n<h2 id=\"h_01JKGCSBM4ZK72ABRS44XQVCTY\">Step 3: Retrieve the API key</h2>\n<p>The user will be redirected to your website by Digistore24.</p>\n<p>Call up the API function <a href=\"https://digistore24.com/api/docs/index.html#/API%20Key%20Management\" target=\"_blank\" rel=\"noopener noreferrer\">retrieveApiKey()</a> with your developer key.</p>\n<p>Pass these parameter:</p>\n<ul>\n<li>\n<strong>token</strong> - the request_token from Step 3</li>\n</ul>\n<p>The api call will return:</p>\n<ul>\n<li>\n<strong>api_key</strong> - the users api key</li>\n</ul>\n<h2 id=\"h_01JKGCSN2RM5G9ABQMG6BKB2FX\">Sample script</h2>\n<p>We deliver a sample script together with the <a href=\"https://dev.digistore24.com/hc/en-us/articles/32479630493585\">PHP class</a> (the file examples/register.php) which demonstrates the creation of the API key.</p>\n<p><strong>Security</strong></p>\n<h2 id=\"h_01JKGCT49CH1G9DZ50J8RPM1TA\">HTTPS</h2>\n<p>Furthermore, we recommend you to secure your app via SSL (i.e. the URL of your app begins with https://)</p>\n<h2 id=\"h_01JKGCTEV9MWGT95EWVZQEXYDD\">Disconnect</h2>\n<p>Enable the user to disconnect.</p>\n<p>For this please call up the function <a href=\"https://digistore24.com/api/docs/index.html#/API%20Keys\" target=\"_blank\" rel=\"noopener noreferrer\">unregister()</a> via API. The API key will be deleted on the server then. Furthermore, associated IPN connections will be deleted.</p>\n<p>Afterwards please delete the API key of your app.</p>","user_segment_ids":[]},{"id":32480217565969,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32480217565969.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32480217565969-Quick-Integration-Guide","author_id":30422410011025,"comments_disabled":false,"draft":false,"promoted":false,"position":0,"vote_sum":3,"vote_count":11,"section_id":32544282072977,"created_at":"2025-02-07T11:42:13Z","updated_at":"2026-09-13T11:44:24Z","name":"Quick Integration Guide","title":"Quick Integration Guide","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-06-30T12:22:36Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>This guide is for software developers and system administrators, who want to connect a vendor’s billing system to Digistore24.</p>\n<h2 id=\"h_01JKG3FD8S250N4J47WP96FGM6\">Introduction</h2>\n<p>A buyer orders the product “Guide To Happiness”.</p>\n<p>Then there will be:</p>\n<ul>\n<li>An order-ID for each order, e.g. A3NXHEHF. This order-ID is unique.</li>\n<li>A product-ID, e.g. 122343 for product “Guide to Happiness”. Each order of “Guide to Happiness” has the same product-ID 122343.</li>\n<li>A transaction-ID for each transaction and test payment. A transaction is a payment, a refund or a chargeback. This transaction-ID is unique.</li>\n</ul>\n<h2 id=\"h_01JKG17VQ0SR205YWDDBJRNHZS\">Term explanation</h2>\n<p><strong>Buyer</strong></p>\n<p>A buyer is the person in front of the computer screen, who buys your product.</p>\n<p><strong>Order</strong></p>\n<p>If a buyer buys one or more products using the same order form at the same time, this is one order.</p>\n<p>An order consists of one initial sale and up to three upsells. These are referred to as “order items”.</p>\n<p><strong>Transaction</strong></p>\n<p>A transaction is a payment, a refund or a chargeback.</p>\n<p>At Digistore24, we process one transaction for each order item.</p>\n<p><strong>Example</strong>: If a buyer buys an initial sale and the first upsell, then there are two transactions meaning two payments.</p>\n<p><strong>IPN Call</strong></p>\n<p>This is the instant payment notification (IPN) we send to your server. For each transaction, there is one IPN-call. If a customer buys three products, there will be three IPN calls – one for each payment of each product.</p>\n<h2 id=\"h_01JKG19GA24TVRWPV0GASYYQY1\">Quick Integration Guide</h2>\n<h3 id=\"h_01JKG19JTHH35WX9TQHXS5YYQ1\">Preparing the IPN script</h3>\n<ol>\n<li>Download the <a href=\"https://www.digistore24.com/download/ipn/examples/ipn/ipn_receiver.php\" target=\"_blank\" rel=\"noopener noreferrer\">IPN receiver script</a> here.</li>\n<li>Review the script. Locate the comments and adjust the script according to the comments. Pay special attention to the “// EDIT HERE”-comments.</li>\n<li>Make sure the constant SHA_PASSPHRASE is set to a unique, non-guessable value.</li>\n<li>Put the script on your server. Note the URL, which will run the script on your server.</li>\n</ol>\n<h3 id=\"h_01JKG1A0DH5HB7BB601NX5DWHV\">Creating an IPN connection in Digistore24</h3>\n<ol>\n<li>Go to <strong><a href=\"https://www.digistore24-app.com/vendor/settings/ipn\" target=\"_blank\" rel=\"noopener noreferrer\">Settings &gt; Integrations (IPN)</a></strong>.</li>\n<li>Click <strong><a href=\"https://www.digistore24-app.com/vendor/settings/ipn/edit/new/\" target=\"_blank\" rel=\"noopener noreferrer\">Add new connection</a></strong>.</li>\n<li>Scroll down and click <strong><a href=\"https://www.digistore24-app.com/vendor/settings/ipn/edit/new/generic/\" target=\"_blank\" rel=\"noopener noreferrer\">Generic</a></strong>.</li>\n<li>Enter a <strong>Name</strong> for the connection.</li>\n<li>Go to <strong>For products</strong> to select which products the IPN connection should be applied to.</li>\n<li>Go to <strong>Send notifications for</strong> to select for what kind of events notifications should be sent.</li>\n<li>Go to <strong>For order event</strong> to select for which order events notifications should be sent.\n<blockquote class=\"elevio-box-success\">\n<strong>Note</strong>\n<p>Make sure the order events that you have specified in your script are selected here as well.  </p>\n</blockquote>\n</li>\n<li>As <strong>IPN URL</strong>, enter the URL which will run the script on your server.</li>\n<li>As <strong>IPN password</strong>, enter the SHA_PASSPHRASE of your script.</li>\n<li>As <strong>IPN</strong> <strong>timing</strong>, select “Before redirect to thank you page”.</li>\n<li>Make sure <strong>Active</strong> is set to <strong>Yes</strong>.</li>\n<li>Click <strong>Test connection </strong>and review the result.</li>\n<li>If the return says \"OK\", click <strong>Save</strong>. Otherwise, make the required changes and re-test the connection.</li>\n<li>Test your IPN setup.\n<ol>\n<li>Make a test purchase.</li>\n<li>Check if the order is processed correctly on your server.</li>\n<li>Go to <a href=\"https://www.digistore24-app.com/vendor/reports/ipn\">Reports &gt; IPN</a> to review the IPN log.</li>\n</ol>\n</li>\n</ol>\n<h3 id=\"h_01JYZZEWTC1DN32DW83BZDV6XD\">Updating your IPN setup</h3>\n<p>Use this procedure to update your existing IPN setup in Digistore24 when parameters or logic change.</p>\n<ol>\n<li>\n<strong>Backup your existing setup.</strong>\n<ol>\n<li data-start=\"496\" data-end=\"537\">\n<p data-start=\"498\" data-end=\"537\">Save a copy of the current IPN script.</p>\n</li>\n<li>Go to <strong><a href=\"https://www.digistore24-app.com/vendor/settings/ipn\" target=\"_blank\" rel=\"noopener noreferrer\">Settings &gt; Integrations (IPN)</a></strong>.</li>\n<li>In the list of IPN connections, click the pencil icon next to the connection you want to update.</li>\n<li data-start=\"538\" data-end=\"626\">\n<p data-start=\"540\" data-end=\"626\">Note your existing Digistore24 IPN configurations, i.e. URL, IPN password, selected products and order events.</p>\n</li>\n</ol>\n</li>\n<li>\n<strong>Update your IPN script.</strong>\n<ol>\n<li data-start=\"700\" data-end=\"752\">\n<p data-start=\"702\" data-end=\"752\">Edit the IPN script as desired.</p>\n</li>\n<li data-start=\"753\" data-end=\"790\">\n<p data-start=\"755\" data-end=\"790\">Set a new SHA_PASSPHRASE.</p>\n</li>\n</ol>\n</li>\n<li>\n<strong>Upload your IPN script.</strong>\n<ol>\n<li>Upload the updated IPN script to your server.</li>\n<li>Note the new IPN URL.</li>\n</ol>\n</li>\n<li>\n<strong>Update your Digistore24 settings.</strong>\n<ol>\n<li>Go to <strong><a href=\"https://www.digistore24-app.com/vendor/settings/ipn\" target=\"_blank\" rel=\"noopener noreferrer\">Settings &gt; Integrations (IPN)</a></strong>.</li>\n<li>In the list of IPN connections, click the pencil icon next to the connection you want to update.</li>\n<li>Go to <strong>For products</strong> to review which products the IPN connection should be applied to.</li>\n<li>Go to <strong>Send notifications for</strong> to review for what kind of events notifications should be sent.</li>\n<li>Go to <strong>For order event</strong> to review for which order events notifications should be sent.\n<blockquote class=\"elevio-box-success\">\n<strong>Note</strong>\n<p>Make sure the order events that you have specified in your script are selected here as well.</p>\n</blockquote>\n</li>\n<li>Replace the old <strong>IPN URL</strong> with the new one.</li>\n<li>As <strong>IPN password</strong>, enter the new SHA_PASSPHRASE.</li>\n<li>Click <strong>Test connection </strong>and review the result.</li>\n<li>If the return says \"OK\", click <strong>Save</strong>. Otherwise, make the required changes and re-test the connection.</li>\n</ol>\n</li>\n<li>\n<strong>Test your IPN setup.</strong>\n<ol>\n<li>Make a test purchase.</li>\n<li>Check if the order is processed correctly on your server.</li>\n<li>Go to <strong><a href=\"https://www.digistore24-app.com/vendor/reports/ipn\">Reports &gt; IPN</a> </strong>to review the IPN log.</li>\n</ol>\n</li>\n</ol>\n<p> </p>","user_segment_ids":[]},{"id":32479630493585,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32479630493585.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32479630493585-API-basics","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":0,"vote_sum":4,"vote_count":18,"section_id":32478845811473,"created_at":"2025-02-07T11:24:16Z","updated_at":"2026-09-11T12:52:04Z","name":"API basics","title":"API basics","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:42:30Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>The Digistore24 API allows external applications to access your Digistore24 account. This site is the technical documentation of the API and only interesting for software and application developers.</p>\n<h2 id=\"h_01JKG24E18KV8MDGF22XXNZBA9\">The Digistore24 API</h2>\n<p>Via the Digistore24 API, your applications, data – e.g. a list of products and orders – can be read out. Depending on the access authority, data can be changed as well – e.g. orders can be cancelled. The access is possible via the API key of the user of your applications via HTTP.</p>\n<h2 id=\"h_01JKG24J05T4BWD6PTRQ6R8FS3\">API key</h2>\n<p>You need an API key to get access to the Digistore24 API. To generate an API key, please proceed as follows:</p>\n<ul>\n<li>Log in into your Digistore24 account</li>\n<li>In vendor view, select <a href=\"https://www.digistore24-app.com/vendor/settings/account_access/\" target=\"_blank\" rel=\"noopener noreferrer\">settings &gt; account access</a>\n</li>\n<li>Select the tap <a href=\"https://www.digistore24-app.com/vendor/settings/account_access/api\" target=\"_blank\" rel=\"noopener noreferrer\">Api key</a>\n</li>\n<li>Click <a href=\"https://www.digistore24-app.com/vendor/settings/account_access/api_edit/new\" target=\"_blank\" rel=\"noopener noreferrer\">New API key</a>\n</li>\n<li>fill in a name, select the appropiate permissions and save</li>\n</ul>\n<p>The API key will be displayed. It is a long combination of letters and numbers as for example:</p>\n<p><code>123-iKWIrTsUTbCyRFuotOdV8yO2xnfMI5b3rZhDCUAG</code></p>\n<p>For every API key, you can select one of the following API permissions:</p>\n<ul>\n<li>\n<strong>readonly</strong> = read access: There cannot be made any changes in your account with the key. However, information can be retrieved, as for example sales or details of a specific order.</li>\n<li>\n<strong>writable</strong> = full access: Changes in your account are possible, as for example cancelling an order. Information can be retrieved, like with the read access.</li>\n<li>\n<strong>developer</strong> = developer key: With this key, your app can generate an API key for your users. A read or full access is <strong>not</strong> possible with this key. You can publish the developer key in the source code of your app.</li>\n</ul>\n<h2 id=\"h_01JKG24SG8C9GD9DYDNKESTQX5\">PHP class</h2>\n<p>We have prepared a PHP class and several examples for you - <a href=\"https://www.digistore24.com/download/package/digistore-api.zip\" target=\"_blank\" rel=\"noopener noreferrer\">click here to download</a>.</p>\n<p>You can find all functions you can call up via the Digistore24 API in the <a href=\"https://dev.digistore24.com/hc/en-us/articles/38492246374673\">API reference</a>.</p>\n<p>The PHP class is compatible with future versions of the Digistore24 API. I.e. even if the Digistore24 API will expand, you can still use your current version of the PHP class.</p>\n<h2 id=\"h_01JKG24ZP458GV9ZS8TFP9YR8V\">Javascript API</h2>\n<p>We also provide a Javascript API connector - <a href=\"https://www.digistore24.com/download/package/digistore-js-api.zip\" target=\"_blank\" rel=\"noopener noreferrer\">download it here</a>.</p>\n<p>Even this connector works with all functions of the <a href=\"https://dev.digistore24.com/hc/en-us/articles/38492246374673\">API reference</a>.</p>\n<blockquote class=\"elevio-box-warning\">\n<strong>Caution</strong>\n<p>API keys which are being used with the Javascript API can be reviewed easily. Please use only developer keys with the Javascript API.</p>\n</blockquote>\n<h2 id=\"h_01JKG258V6JZDD01YFVQYR0DYC\">HTTP call</h2>\n<p>If you use the PHP class mentioned above, you can skip this section.</p>\n<p>In order to use the API without PHP class, please carry out HTTP calls to the following URL:</p>\n<p>https://www.digistore24.com/api/call/FUNCTION</p>\n<p>Please replace FUNCTION: function name – cf. <a href=\"https://dev.digistore24.com/hc/en-us/articles/38492246374673\">API reference</a></p>\n<p>You can transfer function arguments as GET or POST parameters.</p>\n<h3 id=\"h_01JKG25N2HMXRYT9RWWN0E8X7F\">Set http headers</h3>\n<p>Set these http headers for secure authentication:</p>\n<ul>\n<li>X-DS-API-KEY: Your Digistore24 API key</li>\n<li>Accept:\n<ul>\n<li>application/json ⇒ json response (default)</li>\n<li>text/plain ⇒ plain text response</li>\n<li>text/xml ⇒ xml response</li>\n<li>application/php ⇒ response as php serialized array</li>\n</ul>\n</li>\n</ul>\n<h3 id=\"h_01JKG261CY7QX0AGTHNZGKFSGT\">Example of a function call</h3>\n<p>The following function call shall be carried out:</p>\n<ul>\n<li>resendPurchaseConfirmationMail( 'X26QE8GN' )</li>\n</ul>\n<p>Then the URL can be:</p>\n<p>https://www.digistore24.com/api/call/resendPurchaseConfirmationMail?purchase_id=X26QE8GN</p>\n<p>The server answers with a text document with the following exemplary content:</p>\n<p><code>{<br>   \"api_version\": \"1.234\",<br>  \n    \"current_time\": \"2014-03-14 17:30:08\",<br>  \n    \"result\": \"success\",<br>   \"data\":\n    {<br>     \"modified\": \"Y\",<br>  \n      \"note\": \"The confirmation mail has been sent.\"<br>  \n    }<br> }</code></p>\n<p>Here, the answer is a data set in the <a href=\"https://en.wikipedia.org/wiki/JSON\" target=\"_blank\" rel=\"noopener noreferrer\">JSON format</a>.</p>\n<p>If succeeded, you will get an object with the following fields:</p>\n<ul>\n<li>\n<strong>api_version</strong> – the (server-side) version of the Digistore24 API, e.g. 1.234</li>\n<li>\n<strong>result</strong> – „success“</li>\n<li>\n<strong>data</strong> – data object that has given back the called function</li>\n</ul>\n<p>If unsuccessful, you will get an object with the following fields:</p>\n<ul>\n<li>\n<strong>api_version</strong> – the (server-side) version of the Digistore24 API, e.g. 1.234</li>\n<li>\n<strong>result</strong> – „error“</li>\n<li>\n<strong>message</strong> – the error message</li>\n<li>\n<strong>code</strong> – an error code</li>\n</ul>\n<h2 id=\"h_01JKG26TZHDGQP1H81PQ4E2SFM\">Numbered or named parameter</h2>\n<p>If you transfer the function arguments as POST or GET parameter, you can choose:</p>\n<ul>\n<li>You transfer the parameter with <strong>numbered</strong> names: arg1, arg2, arg3 etc. This is helpful if you are developing a generic adapter for the API, as for example the <a href=\"#h_01JKG24SG8C9GD9DYDNKESTQX5\">PHP class</a> mentioned above.</li>\n<li>Otherwise you can use the <strong>named</strong> names from the <a href=\"https://dev.digistore24.com/hc/en-us/articles/38492246374673\" target=\"_blank\" rel=\"noopener noreferrer\">API reference</a>, e.g. purchase_id, transaction_id etc. This Dies improves the readability of your source code.</li>\n</ul>\n<h2 id=\"h_01JKG272TMJ9Z9KJAFQH1FPVCM\">Arrays as parameter</h2>\n<p>Some functions (like <a href=\"https://digistore24.com/api/docs/index.html#/Buy%20URLs\" target=\"_blank\" rel=\"noopener noreferrer\">createBuyUrl())</a> expect arrays as function arguments.</p>\n<p>Example: You want to transfer the following array:</p>\n<p><code>buyer = array(<br>    name =&gt; Udo,<br>   \n    email =&gt; uw@ds24mail.com<br> )</code></p>\n<p>You transfer the data of the array as follows:</p>\n<p><code>…&amp;buyer[name]=Udo&amp;buyer[email]=uw@ds24mail.com</code></p>\n<p>or with numbered parameters</p>\n<p><code>…&amp;arg1[name]=Udo&amp;arg1[email]=uw@ds24mail.com</code></p>\n<h2 id=\"h_01JKG27B19CY10CF10K0DEXGG1\">General parameter</h2>\n<p>Besides the accepted parameters arg1/arg2/… the following parameters can always be transfered:</p>\n<ul>\n<li>\n<strong>language</strong>: 'de' or 'en' – language for the messages of the API. Default is the language of the Digistore24 account to which the API key belongs.</li>\n<li>\n<strong>operator</strong>: string – name of a responsible person for the changes that are made in Digistore24 by the API call. This will only be used for the protocol, so that you can reproduce which user of your app has cancelled an order, for instance.</li>\n</ul>\n<h2 id=\"h_01JKG27P97T7BSBK1JJGGZN0WV\">Further development of the API</h2>\n<p>We will advance the API in the near future but we will keep the downward compatibility.</p>\n<p>We will undertake the following changes <strong>unheralded</strong>:</p>\n<ul>\n<li>We will add new functions to the API.</li>\n<li>Existing functions will get additional function arguments that are optional (so that your software can run with it).</li>\n<li>There can be changes in the original terms of texts and error messages. E.g. the plain text descriptions for the order status can change (i.e. the return value of billing_status_msg) – the internal descriptions (the value of billing_status) will not change, at the most it will be complemented by new values.</li>\n<li>The answers of the server will get additional data fields (which your app can ignore).</li>\n<li>The API version will change.</li>\n</ul>\n<p>Please design you app in a way that is compatible with these changes and no changes in the source code has to be made. Otherwise it might happen that you app will not run properly.</p>\n<p>Following things will not change:</p>\n<ul>\n<li>The names of the functions and the existing function arguments</li>\n<li>The API URL as well as the whole mechanism of the API access</li>\n</ul>","user_segment_ids":[]},{"id":32487250818833,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32487250818833.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32487250818833-Orderform-Widget-for-the-users-of-your-platform","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":1,"vote_sum":-2,"vote_count":4,"section_id":32477029106449,"created_at":"2025-02-07T15:00:20Z","updated_at":"2026-09-04T10:22:56Z","name":"Orderform-Widget for the users of your platform","title":"Orderform-Widget for the users of your platform","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:49:19Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>If you run a platform, and your user are vendors on Digistore24, you can offer your users a customizable order form widget.</p>\n<p>It is integrated on the sales pages on your platform and enables direct orders to be placed from Digistore24.</p>\n<p>The order form widget is configurable via an API and can complete orders in one, two or three steps.</p>\n<p><img src=\"https://dev.digistore24.com/hc/article_attachments/32487250816273\" alt=\"api-kochbuch-multi-step-orderbox.png\"></p>\n<h2 id=\"h_01JKGD5QJ7278DFJHB9WAAKWAN\">Requirements</h2>\n<ul>\n<li>You run a platform</li>\n<li>The users of your platform are vendors on Digistore24</li>\n<li>The vendors have a <a href=\"https://dev.digistore24.com/hc/en-us/articles/32486158815121\">Digistore24 API key</a>, which is stored in your platform.</li>\n</ul>\n<h2 id=\"h_01JKGD62K5XZK7F2X19F8RE5R6\">Basics</h2>\n<p>As a test, you can manually create an order form widget on Digistore24.</p>\n<p>In the vendor view, select <a href=\"https://www.digistore24.com/vendor/account/orderforms/edit/new/widget\" target=\"_blank\" rel=\"noopener noreferrer\">Account – Order forms – New order form widget</a>.</p>\n<p>You can adjust all the settings of the order form editor via the Digistore24 API.</p>\n<h2 id=\"h_01JKGD6E7KPP9P773Y9S00VAY5\">Process</h2>\n<h2 id=\"h_01JKGEDBTMAH71EQ528M9S0RQY\">Order form editor in your platform</h2>\n<p>On your platform, you provide an editor for the settings of the order form widget.</p>\n<p>You can create or update the widget using the API functions <a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">createOrderform()</a> and <a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">updateOrderform()</a>. The order form widget is integrated via iframe. If you have changed the settings, reload the iframe.</p>\n<h2 id=\"h_01JKGEDHZT8YGSNVEW4GC4W6DF\">Displays of the order form</h2>\n<p>Include this HTML code on your page. You use this code for the editor and for the productive version of your sales page.</p>\n<p><code>&lt;script\n    src='https://www.digistore24.com/service/js/orderform_widget.js'&gt;&lt;/script&gt;&lt;script&gt;const\n    DS24_ORIGIN='https://www.digistore24.com';&lt;/script&gt;<br>&lt;iframe\n    id='ds24_payIFrame' style='overflow: hidden; width: 100%;\n    height: 600px; border: none; background: transparent;'\n    src='https://www.digistore24.com/product/PRODUCT_ID/ORDERFORM_ID'&gt;&lt;/iframe&gt;</code></p>\n<p>Replace the placeholders PRODUCT_ID and ORDERFORM_ID accordingly.</p>\n<p>The product and order form must belong to the same Digistore24 vendor.</p>\n<h2 id=\"h_01JKGEDQNDXPKMAS1JCB8WQHC8\">Editor mode</h2>\n<p>While editing the order form, the user will often want to switch between tabs. To make this process easier, add the following JavaScript code in your editor:</p>\n<p><code>&lt;script&gt;<br>    \n    window.addEventListener(\"ds24-msob-onload\", function( e ) {<br>        \n    ds24_setEditorMode();<br>     } );<br>&lt;/script&gt;</code></p>\n<h2 id=\"h_01JKGEDYZVGGYMB4A455HTNN5D\">Design possibilities</h2>\n<p>Your platform can provide graphics for the tabs, as well as the custom CSS code that allows you to customize the order form widget. These can then be created using the API functions <a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">createOrderform()</a> or <a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">updateOrderform()</a> on the widget (using the fields tab_image_1_url, tab_image_2_url and tab_image_3_url and custom_css, respectively).</p>\n<p><strong>Important</strong>: The <strong>Digistore24 logo</strong> at the bottom of the order form must remain visible and unchanged. This is a requirement set by our payment provider.</p>\n<h2 id=\"h_01JKGEE41BAHWWHW0Z7R1YF9ZK\">API functions</h2>\n<p>To create and maintain the order form on Digistore, use the following API functions:</p>\n<ul>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">createOrderform()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">getOrderform()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">updateOrderform()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">deleteOrderform()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">listOrderforms()</a></li>\n</ul>\n<p>Other useful functions are also possible:</p>\n<ul>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Order%20Forms\" target=\"_blank\" rel=\"noopener noreferrer\">getOrderformMetas()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Products\" target=\"_blank\" rel=\"noopener noreferrer\">listProducts()</a></li>\n</ul>\n<p>If you want Digistore24 to manage the images of your users:</p>\n<ul>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Images\" target=\"_blank\" rel=\"noopener noreferrer\">createImage()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Images\" target=\"_blank\" rel=\"noopener noreferrer\">deleteImage()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Images\">listImages()</a></li>\n</ul>\n<h2 id=\"h_01JKGEEDHW1GE4XY65WDWNVWG4\">Digistore24 order form widget JS API</h2>\n<p>You can change the order form from your sales page or from the editor using the following JavaScript API.</p>\n<h3 id=\"h_01JKGEENA7VSQ32HWSNVZ4S6YD\">Call functions after document loading</h3>\n<p>The multistep order box triggers the ds24-msob-onload event, after it has been fully loaded. When using the following functions, make sure, you use them after this event.</p>\n<p><code>&lt;script&gt;<br>    \n    window.addEventListener(\"ds24-msob-onload\", function( e ) {<br>        \n    console.log( e.detail );<br>     } );<br>&lt;/script&gt;</code></p>\n<h3 id=\"h_01JKGEF7Z50J4FW8ZG5KS6X7TC\">function ds24_setEditorMode();</h3>\n<p>Activates the editor mode. The user can then change the tabs without having to fill in the entry fields correctly.</p>\n<p>The editor mode can also be set via the GET parameter editor_mode=1, e.g.:</p>\n<p><code>...<br>&lt;iframe ...\n    src='https://www.digistore24.com/product/PRODUCT_ID/ORDERFORM_ID?editor_mode=1'&gt;&lt;/iframe&gt;</code></p>\n<h3 id=\"h_01JKGEFGQW3ZS0TJ71ZFKDEGB8\">function ds24_reloadIframe();</h3>\n<p>Reloads the iframe. Use this in your editor if changes to the order form have been saved and should now be displayed.</p>\n<h3 id=\"h_01JKGEGAXY2J413PG5ASZZ14X3\">function ds24_setStep( step_no );</h3>\n<p>Sets the current step number. For two-step order forms step_no is 1 or 2. For three-step order forms, it is 1, 2 or 3.</p>\n<p>The current step can also be selected via the GET parameter <strong>step</strong>.</p>\n<h3 id=\"h_01JKGEGJSA5HAMQ03NQF6R1CP9\">function ds24_addEventListener( event_name, event_handler );</h3>\n<p>Adds an event listener.</p>\n<p>The event listener is following function-type: function ( event_name, event_details )</p>\n<p>Supported events:</p>\n<ul>\n<li>Change of the tab:<br>event_name: stepChange<br>event_details: { newStep: NUMBER }</li>\n</ul>\n<h3 id=\"h_01JKGEGTS3487HRBCRZJ7RJ1CA\">function ds24_setContactData( address );</h3>\n<p>Fills in the form with the contacts. Address is an object with these fields (all are optional):</p>\n<ul>\n<li>i_order_as – ‘private' or ‘business'</li>\n<li>company</li>\n<li>first_name</li>\n<li>last_name</li>\n<li>street</li>\n<li>street_number</li>\n<li>zip code</li>\n<li>city</li>\n<li>country – the country as a 2-digit country code e.g. DE, AT or CH.</li>\n<li>phone_no</li>\n<li>tax_id -the VAT ID is only available if i_order_as == ‘business' and if the order was placed from an EU country other than Germany.</li>\n</ul>\n<p><strong>Important</strong>: Changing the country reloads the iframe. To prevent this, the country can also be transferred as the GET parameter country, for example:</p>\n<p><code>...<br>&lt;iframe ...\n    src='https://www.digistore24.com/product/PRODUCT_ID/ORDERFORM_ID?country=AT'&gt;&lt;/iframe&gt;</code></p>\n<p>The other fields (i_order_as, company, first_name, etc.) can also be transferred as GET parameters.</p>\n<h3 id=\"h_01JKGEHEVBRG3R7E2NDDS0S96X\">function ds24_setPaymentPlan( plan_index_or_id );</h3>\n<p>Selects a payment plan.</p>\n<p>plan_index_or_id is either the ID of the payment plan (e.g. 123456) or the index of the payment plan beginning with 1. i.e. plan_index_or_id == 2 selects the second payment plan.</p>\n<h3 id=\"h_01JKGEHQ027YGSQRH6R1FKQ9GB\">function ds24_setQuantity( product_index_or_id, quantity );</h3>\n<p>Sets the quantity for a product.</p>\n<p>product_index_or_id is either the ID of the product (e.g. 123456) or the index of the product beginning with 1. i.e. product_index_or_id == 2 selects the second product.</p>\n<h3 id=\"h_01JKGEHWVB4EX5P8KV5R2S9WJM\">function ds24_setCurrency( currency );</h3>\n<p>Sets the currency.</p>\n<ul>\n<li>\n<strong>currency</strong> – three-digit currency code, e.g. EUR, USD…</li>\n</ul>\n<p>Available currencies are returned via the API function <a href=\"https://digistore24.com/api/docs/index.html#/Currencies\" target=\"_blank\" rel=\"noopener noreferrer\">listCurrencies()</a>.</p>\n<p><strong>Important</strong>: Changing the currency reloads the iframe. To prevent this, the currency can also be transferred as the GET parameter currency, for example:</p>\n<p><code>...<br>&lt;iframe ...\n    src='https://www.digistore24.com/product/PRODUCT_ID/ORDERFORM_ID?currency=USD'&gt;&lt;/iframe&gt;</code></p>\n<h3 id=\"h_01JKGEJ4J61P5SRMMYBX65DVS8\">function ds24_setDiscountVoucher( voucher_code, lock_input, show_msg )</h3>\n<p>The purchase is made with the discount code provided (if it is valid for the purchase).</p>\n<ul>\n<li>\n<strong>voucher_code</strong> – the discount code</li>\n<li>\n<strong>lock_input</strong> – if TRUE, the voucher field is write-protected (if the voucher was valid). If FALSE, the buyer can change the code. Default is TRUE</li>\n<li>\n<strong>show_message</strong> – If TRUE, a popup window with a note about the discount is displayed if the discount is valid. Not for FALSE. Then the discount is applied without a popup. In both cases, the discounted prices are displayed in red and the original prices are crossed out. The default is TRUE.</li>\n</ul>\n<p>You can also pass the voucher code as a GET parameter “voucher” to the iframe url.</p>\n<h3 id=\"h_01JKGEJC7FGQXW2VYGSX964T6Z\">ds24_setCustomParam( custom )</h3>\n<p>Sets the custom parameter, which is also passed to the order form via the GET custom parameter. The parameter is then looped through and passed as a custom field in the IPN message and at the Api call getPurchase() or listPurchases().</p>\n<ul>\n<li>\n<strong>custom</strong> – string, maximum 1023 characters consisting of digits, A-Z, a-z, spaces and the special characters dot <code>.</code>, comma <code>,</code>, tilde <code>~</code>, hyphen <code>-</code> and underscore <code>_</code>.</li>\n</ul>\n<p>You can also pass the voucher code as a GET parameter “custom” to the iframe url.</p>\n<h3 id=\"h_01JKGEJJA47WNF1GWXZ8WSRYA5\">function ds24_currentStep();</h3>\n<p>Returns the current step number: 1, 2 or 3.</p>\n<h3 id=\"h_01JKGEJQWAG8MBT2HR04TVQ0WA\">function ds24_totalStepCount();</h3>\n<p>Returns the total number of steps possible: 1, 2 or 3.</p>\n<h2 id=\"h_01JKGEJZ12TW2ZEE33F7EH3EXQ\">Example</h2>\n<p>This code selects the second step on the order form widget.</p>\n<p><code> &lt;script\n    src='https://www.digistore24.com/service/js/orderform_widget.js'&gt;&lt;/script&gt;&lt;script&gt;const\n    DS24_ORIGIN='https://www.digistore24.com';&lt;/script&gt; &lt;iframe\n    id='ds24_payIFrame' style='overflow: hidden; width: 100%;\n    height: 600px; border: none; background: transparent;'\n    src='https://www.digistore24.com/product/1234/5689'&gt;&lt;/iframe&gt;<br>&lt;script\n    type=\"text/javascript\"&gt;<br>    \n    window.onload = function() {<br>        \n    ds24_setStep(2);<br>     };<br> &lt;/script&gt;</code></p>","user_segment_ids":[]},{"id":32484832075921,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32484832075921.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32484832075921-Special-data-types-for-the-Digistore24-API","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":1,"vote_sum":34,"vote_count":54,"section_id":32478845811473,"created_at":"2025-02-07T13:54:09Z","updated_at":"2026-08-29T00:05:00Z","name":"Special data types for the Digistore24 API","title":"Special data types for the Digistore24 API","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-02-14T15:21:04Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>The Digistore24 API uses its own special values for data types.</p>\n<h2 id=\"h_01JKGA70482VZX215EGQF11EKH\">Boolean</h2>\n<p>Boolean Values can be specified like this:</p>\n<ul>\n<li>Values for TRUE: <code>1</code>, <code>Y</code>, <code>yes</code>, <code>T</code>, <code>true</code>\n</li>\n<li>Values for FALSE: <code>0</code>, <code>N</code>, <code>no</code>, <code>F</code>, <code>false</code>\n</li>\n</ul>\n<h2 id=\"h_01JKGA78A6AVD1V4ACF8GBMT14\">Point of time</h2>\n<p>Points of time can be stated like that:</p>\n<ul>\n<li><code>2014-02-28 23:11:24</code></li>\n<li>\n<code>now</code> for now</li>\n<li>\n<code>24h</code> for the point of time in exactly 24 hours</li>\n<li>\n<code>-24h</code> for the point of time exactly before 24 hours</li>\n<li>\n<code>-3d</code> for the point of time exactly before 3 days</li>\n<li>\n<code>-6h</code> for the point of time exactly before 6 hours</li>\n<li>\n<code>-10m</code> for the point of time exactly before 10 minutes</li>\n<li>\n<code>-30s</code> for the point of time exactly before 30 seconds</li>\n<li>\n<code>6M</code> for the point of time in 6 months</li>\n<li>\n<code>2Y</code> for the point of time in 2 years</li>\n<li>\n<code>2009-06-30T18:30:00+02:00</code> for the given date and time. Use any <a href=\"https://en.wikipedia.org/wiki/ISO_8601\" target=\"_blank\" rel=\"noopener noreferrer\">ISO 8601 formatted date, time and timezone</a>. Digistore transforms date and time into the server timezone.</li>\n</ul>\n<h2 id=\"h_01JKGA7TMJCBTG9Y8TMXZQ8GTZ\">Date</h2>\n<p>Dates can be stated like that:</p>\n<ul>\n<li>`2014-02-28″</li>\n<li>\n<code>now</code> or \"today\" for today</li>\n<li>\n<code>-3d</code> for the date before 3 days</li>\n<li>\n<code>-6h</code> for the date before 6 hours</li>\n<li>\n<code>-10m</code> for the date before 10 minutes</li>\n<li>\n<code>-30s</code> for the date before 30 seconds</li>\n<li>\n<code>6M</code> for the date in 6 months</li>\n<li>\n<code>2Y</code> for the date in 2 years</li>\n<li>\n<code>2009-06-30T18:30:00+02:00</code> for the given date. Use any <a href=\"https://en.wikipedia.org/wiki/ISO_8601\" target=\"_blank\" rel=\"noopener noreferrer\">ISO 8601 formatted date incl. time and timezone</a>. Digistore transforms the date into the server timezone.</li>\n</ul>","user_segment_ids":[]},{"id":32480561422353,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32480561422353.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32480561422353-Events","author_id":30422410011025,"comments_disabled":false,"draft":false,"promoted":false,"position":1,"vote_sum":4,"vote_count":6,"section_id":32544282072977,"created_at":"2025-02-07T11:53:04Z","updated_at":"2026-09-18T02:07:24Z","name":"Events","title":"Events","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-07-21T08:08:59Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<h2 id=\"h_01JKZJB4MYTD35ZZX598VTKPKZ\">IPN Events for Order</h2>\n<p>An IPN-event is sent for each transaction and for some other conditions (such as a missed backbilling payment). The event name is sent as <em>$_POST['event']</em>.</p>\n<p>The names in the backoffice are sent via the parameter \"event_label\".</p>\n<p>Each IPN call sends exactly one of these event notifications:</p>\n<div class=\"admonition admonition-important alert alert--info\">\n<div class=\"admonition-heading\">\n<blockquote class=\"elevio-box-info\">\n<strong>Note</strong>\n<p>When copying any parameters, please pay attention to possible line breaks.</p>\n</blockquote>\n<h4 id=\"h_01JKZJB4MY09VQJE0NVHZP5PCN\">Event Table</h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Event</th>\n<th>Name in backoffice</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>on_payment</td>\n<td>payment</td>\n<td>The buyer makes a successful payment.</td>\n</tr>\n<tr>\n<td>on_refund</td>\n<td>refund</td>\n<td>The support team of the vendor or Digistore24 has initiated a refund, which has been successfully processed.</td>\n</tr>\n<tr>\n<td>on_chargeback</td>\n<td>chargeback</td>\n<td>The credit card company processed a chargeback.</td>\n</tr>\n<tr>\n<td>on_payment_missed</td>\n<td>missed recurring payment</td>\n<td>For a subscription or installment payment, a payment is missing (e.g. due to insufficient funds or expired payment method).<br>Use this to temporarily suspend access to your product or membership until a successful payment is made.<br><strong>Important:</strong> Do not use this event for cancellations or refunds – use last_paid_day instead. You can find more details <a href=\"https://dev.digistore24.com/hc/en-us/articles/32581926939793\">here</a>.<br>Please note that an on_payment event may occur if the buyer succeeds in payment after the on_payment_missed event. In that case, access should be granted again.<br>After this event is triggered, Digistore24 will retry the charge multiple times and notify the customer via email. If all retries fail, the subscription will be automatically cancelled, and last_paid_day will be triggered.</td>\n</tr>\n<tr>\n<td>payment_denial</td>\n<td>rejected payment</td>\n<td>The payment was rejected. The IPN event is sent after the last payment attempt. By default, rejected payments are not selected in the IPN configuration.</td>\n</tr>\n<tr>\n<td>on_rebill_cancelled</td>\n<td>rebilling canceled</td>\n<td>This event is sent immediately when the support clicks the “stop rebilling” button in the order details. When the last paid billing period has ended, last_paid_day is sent.</td>\n</tr>\n<tr>\n<td>on_rebill_resumed</td>\n<td>rebilling resumed</td>\n<td>The buyer has requested to continue the rebilling payments. This event is sent, when the support clicks the “restart rebilling” button in the order details.</td>\n</tr>\n<tr>\n<td>last_paid_day</td>\n<td>end of paid period</td>\n<td>The last paid billing period has ended, usually due to a cancellation or refund.<br>Use this event to permanently revoke access, as no further payments will be collected.<br>It is typically sent early in the morning after the final access day.<br>This event is also triggered automatically if all retry attempts after an on_payment_missed event fail.</td>\n</tr>\n</tbody>\n</table>\n<blockquote class=\"elevio-box-info\">\n<strong> What is the difference between “last_paid_day” and “on_rebill_cancelled”? </strong>\n<p>“On_rebill_cancelled” is sent, when the customers cancels a subscription or installment payment and the support operator stops the payments. “last_paid_day” event is sent, when the last paid billing period has ended.</p>\n</blockquote>\n<h2 id=\"h_01JKZJB4MYES1HQXGY08QRD8Z6\">Other IPN-Events</h2>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Event</th>\n<th>Name in backoffice</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>connection_test</td>\n<td>Test connection</td>\n<td>Our server sends this event to test the connection to your server, e.g. if you hit the “Test connection” button in the vendor’s IPN settings section. The response should always be “OK”.\n<p>If the test fails, check again the above points of <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480217565969\">this integration guide</a> and if the server is reachable with the script.</p>\n</td>\n</tr>\n<tr>\n<td>on_affiliation</td>\n<td>New affiliate</td>\n<td>When an affiliate wants to promote your product and the affiliation is accepted, then an IPN-Call with this event will be sent.</td>\n</tr>\n<tr>\n<td>eticket</td>\n<td>New e-ticket</td>\n<td>For created e-tickets. This may also take place after the order has been placed, as the buyer may not enter the participant data until later. The IPN message for an e-ticket can also be sent twice if, for example, a name is entered or corrected later. Therefore, please use <strong>eticket_id</strong> to check whether the ticket is already in your database.</td>\n</tr>\n<tr>\n<td>custom form</td>\n<td>New custom form</td>\n<td>For completed additional input fields.</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4MY985KYASETXSBP1FD\">Order Events</h2>\n<p>With each IPN request, we send this set of parameters.</p>\n<p>These parameters are included in the SHA512 signature.</p>\n<p>The SHA512 Signature itself is transferred as the parameter <strong>\"sha_sign\"</strong>.</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parametername</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_version</td>\n<td>float</td>\n<td>Current version of the IPN-interface.</td>\n<td>1.2</td>\n</tr>\n<tr>\n<td>api_mode</td>\n<td>string(4)</td>\n<td>Indicates live or test mode. Possible values: live, test</td>\n<td>live</td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>string(15)</td>\n<td>Unique ID of the order. Multiple transactions of the same order have the same order-ID.</td>\n<td>34DEFS45DE2</td>\n</tr>\n<tr>\n<td>order_date</td>\n<td>string(10)</td>\n<td>Date of the order.</td>\n<td>2013-03-31</td>\n</tr>\n<tr>\n<td>order_time</td>\n<td>string(8)</td>\n<td>Time of the order</td>\n<td>15:57:34</td>\n</tr>\n<tr>\n<td>order_type</td>\n<td>string(31)</td>\n<td>Type of order. Values are:\n<p><strong>regular</strong> - order via regular orderform</p>\n<p><strong>upgrade</strong> - replaces of an existing order (see below)</p>\n<p><strong>phone_order</strong> - order via DigiCalls</p>\n<p><strong>cart</strong> - shopping cart order</p>\n<p><strong>vat_change</strong> - created because of change of vat</p>\n<p> </p>\n</td>\n<td>regular</td>\n</tr>\n<tr>\n<td>order_date_time</td>\n<td>string(19)</td>\n<td>Date and time of the order.</td>\n<td>2013-03-31 15:57:34</td>\n</tr>\n<tr>\n<td>transaction_date</td>\n<td>date</td>\n<td>Date of the transaction (e.g. of the payment). It is often the same as order_date but may differ, e.g. for payment by e-check.</td>\n<td>2013-03-31</td>\n</tr>\n<tr>\n<td>receipt_url</td>\n<td>string(127)</td>\n<td>URL for the receiving page of the order of Digistore24.</td>\n<td>https://www.digistore24.com/receipt/abc123/xyz789</td>\n</tr>\n<tr>\n<td>renew_url</td>\n<td>string(127)</td>\n<td>URL to redo a payment if the payment was cancelled (or to change the payment data for rebilling).</td>\n<td>https://www.digistore24.com/renew/abc123/xyz789</td>\n</tr>\n<tr>\n<td>add_url</td>\n<td>string(127)</td>\n<td>URL to add or remove products from an order (when the main product’s or the addon’s quantity may be changed after the purchase. This is set up in the product editor).</td>\n<td>https://www.digistore24.com/order/add/abc123/xyz789</td>\n</tr>\n<tr>\n<td>support_url</td>\n<td>string(127)</td>\n<td>URL to access our buyer support system. This system answers frequently asked questions. It also allows the buyer to cancel rebilling payments and to request a refund.</td>\n<td> </td>\n</tr>\n<tr>\n<td>rebilling_stop_url</td>\n<td>string(127)</td>\n<td>URL to stop the rebilling payments. It's empty if the purchase is not a rebilling purchase.</td>\n<td> </td>\n</tr>\n<tr>\n<td>request_refund_url</td>\n<td>string(127)</td>\n<td>URL to request a refund.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_details_url</td>\n<td>string(127)</td>\n<td>URL for order details. If you are not logged in at Digistore24, you will be asked to log in.</td>\n<td> </td>\n</tr>\n<tr>\n<td>customer_to_affiliate_url</td>\n<td>string(127)</td>\n<td>If you have enabled the “Customers to Affiliates”-program for the purchased main product, this links contains the invitation URL for the customer to become an affiliate. If they follow the URL, a Digistore24-account will be created. If the program is disabled/inactive, this parameter is missing.</td>\n<td>https://www.digistore24.com/become_affiliate/abc123/xyz789</td>\n</tr>\n<tr>\n<td>customer_affiliate_name</td>\n<td>string(31)</td>\n<td>If the buyer has a Digistore24 account, this is the account name. This does not necessarily mean, that they have established affiliations with your products.</td>\n<td>user12345\n<p>someusername</p>\n</td>\n</tr>\n<tr>\n<td>customer_affiliate_promo_url</td>\n<td>tring(127)</td>\n<td>The new affiliate my use this url to promote the product he bought.</td>\n<td>http://www.digistore.local/redir/54321/user12345/</td>\n</tr>\n<tr>\n<td>payment_id</td>\n<td>string(40)</td>\n<td>Unique ID of the payment. Multiple payments of the same order have different payment-IDs.</td>\n<td>PAYID-43-3999234</td>\n</tr>\n<tr>\n<td>merchant_id</td>\n<td>int</td>\n<td>Unique ID of a vendor.</td>\n<td>39499382</td>\n</tr>\n<tr>\n<td>merchant_name</td>\n<td>string(31)</td>\n<td>Unique Digistore24 name of the vendor.</td>\n<td>JohnSmith</td>\n</tr>\n<tr>\n<td>custom</td>\n<td>string(63)</td>\n<td>Custom parameter the vendor has sent as GET-Parameter “custom” to the order form.</td>\n<td>user_300342</td>\n</tr>\n<tr>\n<td>country</td>\n<td>string(2)</td>\n<td>Country ISO-Code (two characters) of the buyer’s country. If the buyer does not enter a country (e.g. for digital products), the country is determined using the buyer's IP.</td>\n<td>US</td>\n</tr>\n<tr>\n<td>is_gdpr_country</td>\n<td>Y/N</td>\n<td>Y = The user data fall under the EU gdrp (German: DSGVO)\n<p>N = The user data do not fall under the gdrp.</p>\n</td>\n<td>Y</td>\n</tr>\n<tr>\n<td>affiliate_id</td>\n<td>int</td>\n<td>Unique ID of the affiliate. It is “0” if the sale was made without an affiliate.</td>\n<td>339993</td>\n</tr>\n<tr>\n<td>affiliate_name</td>\n<td>string(31)</td>\n<td>Unique Digistore24 name of the affiliate. It is empty if the sale was made without an affiliate.</td>\n<td> </td>\n</tr>\n<tr>\n<td>campaignkey</td>\n<td>string(23)</td>\n<td>The campaignkey of the affiliate (used as part of the promolink).</td>\n<td>NewsletterXY</td>\n</tr>\n<tr>\n<td>trackingkey</td>\n<td>string(47)</td>\n<td>The vendor’s trackingkey (used as GET-Parameter “ds24tr” as part of the promolink or orderform-URL)</td>\n<td>SalespageXY</td>\n</tr>\n<tr>\n<td>salesteam_name</td>\n<td>string(63)</td>\n<td>Name of the sales team who has created the purchase.</td>\n<td>A-Team</td>\n</tr>\n<tr>\n<td>salesteam_id</td>\n<td>int</td>\n<td>The ID of the sales team.</td>\n<td>12345</td>\n</tr>\n<tr>\n<td>transaction_id</td>\n<td>int</td>\n<td>The transaction-ID.</td>\n<td>3999938</td>\n</tr>\n<tr>\n<td>transaction_amount</td>\n<td>float</td>\n<td>The amount of the transaction.</td>\n<td>37.99</td>\n</tr>\n<tr>\n<td>transaction_currency</td>\n<td>string(3)</td>\n<td>Currency code.</td>\n<td>USD</td>\n</tr>\n<tr>\n<td>transaction_processed_at</td>\n<td>date</td>\n<td>Date of the transaction.</td>\n<td>2012-03-23 18:21:47</td>\n</tr>\n<tr>\n<td>transaction_type</td>\n<td>enum</td>\n<td>Possible values: payment, refund, chargeback</td>\n<td>payment</td>\n</tr>\n<tr>\n<td>pay_sequence_no</td>\n<td>int</td>\n<td>For single payments this value is 0. For instalments and subscription only: Number of payment, e.g. 1 for the first payment, 2 for the second and so on.</td>\n<td>3</td>\n</tr>\n<tr>\n<td>currency</td>\n<td>string(3)</td>\n<td>Currency code.</td>\n<td>USD</td>\n</tr>\n<tr>\n<td>amount_brutto</td>\n<td>float</td>\n<td>Gross amount of the payment.</td>\n<td>97.00</td>\n</tr>\n<tr>\n<td>amount_netto</td>\n<td>float</td>\n<td>Net/After-tax amount of the payment (i.e. the Gross amount minus the VAT-amount).</td>\n<td>81.51</td>\n</tr>\n<tr>\n<td>amount_vat</td>\n<td>float</td>\n<td>Amount of the VAT.</td>\n<td>15.49</td>\n</tr>\n<tr>\n<td>amount_provider</td>\n<td>float</td>\n<td>Fee for Digistore24.</td>\n<td>8.66</td>\n</tr>\n<tr>\n<td>amount_fee</td>\n<td>float</td>\n<td>If applicable: chargeback fee.</td>\n<td>0.00</td>\n</tr>\n<tr>\n<td>amount_payout</td>\n<td>float</td>\n<td>Amount shared between vendor, affiliate, Joint Venture partner and Cross Upsell partner (as far as applicable).</td>\n<td>72.85</td>\n</tr>\n<tr>\n<td>amount_vendor</td>\n<td>float</td>\n<td>Share of the vendor.</td>\n<td>51.00</td>\n</tr>\n<tr>\n<td>amount_affiliate</td>\n<td>float</td>\n<td>Share of the affiliate (if applicable).</td>\n<td>21.85</td>\n</tr>\n<tr>\n<td>amount_partner</td>\n<td>float</td>\n<td>Share of Joint Venture/Cross Upsell partners (if applicable).</td>\n<td>0.00</td>\n</tr>\n<tr>\n<td>amount_credited</td>\n<td>float</td>\n<td>If the buyer performs an upgrade or downgrade of the order, changes the payment plan or removes items from an existing order, there may be a credit balance from the previous purchase. This is the amount of the credit balance for this payment.</td>\n<td>0.00</td>\n</tr>\n<tr>\n<td>vat_rate</td>\n<td>float</td>\n<td>The VAT-rate in percent.</td>\n<td>19.00</td>\n</tr>\n<tr>\n<td>number_of_installments</td>\n<td>int</td>\n<td>Total number of payments including the first payment.</td>\n<td>3</td>\n</tr>\n<tr>\n<td>billing_type</td>\n<td>Possible values: single_payment, subscription, installment</td>\n<td>single_payment</td>\n<td> </td>\n</tr>\n<tr>\n<td>billing_status</td>\n<td>string(15)</td>\n<td>Possible values: paying (only for rebilling; payments are active)aborted, unpaid, reminding, completed (only for single payment and instalments; the single payment is completed/all instalment payments are completed)</td>\n<td>completed</td>\n</tr>\n<tr>\n<td>is_cancelled_for</td>\n<td>date</td>\n<td>If given, the order is cancelled for this date. The product access should stop on this day.</td>\n<td> </td>\n</tr>\n<tr>\n<td>billing_stop_reason</td>\n<td>string(23)</td>\n<td>Only if a rebilling has stopped. Possible values: by_operator, by_buyer, by_refund, by_chargeback, by_payment_denial, by_payment_uncertain, pay_alias_invalid, upgraded, no_product, merchant_inactive, unknown</td>\n<td>by_operator /</td>\n</tr>\n<tr>\n<td>pay_method</td>\n<td>string(23)</td>\n<td>Payment method, e.g. PayPal, ELV, credit card.</td>\n<td>ELV</td>\n</tr>\n<tr>\n<td>tags</td>\n<td>string(47)</td>\n<td>Tags of purchase – separated by commas.</td>\n<td>tag1,tag2,tag3</td>\n</tr>\n<tr>\n<td>tag1</td>\n<td>string(47)</td>\n<td>Tag of first product</td>\n<td>tag1,tag2</td>\n</tr>\n<tr>\n<td>tag2</td>\n<td>string(47)</td>\n<td>Tag of second product</td>\n<td>tag3</td>\n</tr>\n<tr>\n<td>...</td>\n<td>...</td>\n<td>...</td>\n<td> </td>\n</tr>\n<tr>\n<td>product_id</td>\n<td>int</td>\n<td>Unique ID of the product.</td>\n<td>3323323</td>\n</tr>\n<tr>\n<td>product_language</td>\n<td>Language code of the product’s language.</td>\n<td>en</td>\n<td> </td>\n</tr>\n<tr>\n<td>product_name</td>\n<td>string(63)</td>\n<td>Readable name of the product.</td>\n<td>Fast wealth guide</td>\n</tr>\n<tr>\n<td>product_delivery_type</td>\n<td>enum</td>\n<td>Possible values: digital, shipping</td>\n<td>digital</td>\n</tr>\n<tr>\n<td>variant_id</td>\n<td>string(31)</td>\n<td>The ID of product variant the buyer has selected (only if variants have been added to the product).</td>\n<td>blue</td>\n</tr>\n<tr>\n<td>variant_name</td>\n<td>string(63)</td>\n<td>The name of the product variant the buyer has selected (only if variants have been added to the product).</td>\n<td>blue coloured shirt</td>\n</tr>\n<tr>\n<td>quantity</td>\n<td>int</td>\n<td>Number of ordered products (with ID “product_id”). The most common one is “1”.</td>\n<td>1</td>\n</tr>\n<tr>\n<td>product_id_2</td>\n<td>int</td>\n<td>Unique ID of the second product of the purchase (if applicable).</td>\n<td> </td>\n</tr>\n<tr>\n<td>product_id_3</td>\n<td>int</td>\n<td>Unique ID of the third product of the purchase (if applicable).</td>\n<td> </td>\n</tr>\n<tr>\n<td>\n<p>product_txn_amount</p>\n<p>product_txn_netto_amount</p>\n<p>product_txn_vat_amount</p>\n<p>product_txn_shipping</p>\n</td>\n<td>amount</td>\n<td>gros/net/vat/shipping amount per product and transaction</td>\n<td>27.33</td>\n</tr>\n<tr>\n<td>\n<p>product_amount</p>\n<p>product_netto_amount</p>\n<p>product_vat_amount</p>\n<p>product_shipping_amount</p>\n</td>\n<td>amount</td>\n<td>dito for the purchase. Is the same as above for subscription and single payment. Differs for installments.</td>\n<td>99.95</td>\n</tr>\n<tr>\n<td>Same for: product_id_4, product_id_5,\n<p>product_name, product_name_2, ...</p>\n<p>product_delivery_type,</p>\n<p>variant_id</p>\n<p>variant_name</p>\n<p>quantity</p>\n<p>product_txn_amount</p>\n<p>product_txn_netto_amount</p>\n<p>product_txn_vat_amount</p>\n<p>product_txn_shipping</p>\n<p>product_amount</p>\n<p>product_netto_amount</p>\n<p>product_vat_amount</p>\n<p>product_shipping_amount</p>\n</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>buyer_id</td>\n<td>int</td>\n<td>The ID of the buyer.</td>\n<td>333222</td>\n</tr>\n<tr>\n<td>email</td>\n<td>string(63)</td>\n<td>The email of the buyer.</td>\n<td>claus@domain-xyz.com</td>\n</tr>\n<tr>\n<td>language</td>\n<td>string(2)</td>\n<td>Language code of the buyer’s language.</td>\n<td>en</td>\n</tr>\n<tr>\n<td>address_first_name</td>\n<td>The first name of the buyer.</td>\n<td>Claus</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_last_name</td>\n<td>The last name of the buyer.</td>\n<td>Myer</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_id</td>\n<td>The adress-ID of the buyer.</td>\n<td>12345</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_street</td>\n<td>Street name and street number. Empty if no address is specified.</td>\n<td>Mainstr.123a</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_street_name</td>\n<td>Street name only.</td>\n<td>Mainstr.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_street_number</td>\n<td>Street number only.</td>\n<td>123a</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_street2</td>\n<td>Only Address suffix</td>\n<td>suite, building, etc.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_city</td>\n<td>City name.</td>\n<td>Berlin</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_state</td>\n<td>Only for countries, which have a state (like USA). E.g. for Germany, no state is given.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_zipcode</td>\n<td>The address-zipcode.</td>\n<td>12345</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_country</td>\n<td>2-Letter ISO country code. Empty if no address is specified.</td>\n<td>DE</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_country_name</td>\n<td>Full name of the country. Empty if no address is specified.</td>\n<td>Germany</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_company</td>\n<td>Empty if no company is specified.</td>\n<td>Some Company Ltd.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_tax_id</td>\n<td>The VAT-ID of the buyer's company. Empty if no VAT-ID is specified.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_phone_no</td>\n<td>Empty if no phone number is specified.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>upgrade_key</td>\n<td>string(23)</td>\n<td>Use this key together with the order id for <a href=\"https://www.digistore24-app.com/vendor/account/upgrades\" target=\"_blank\" rel=\"noopener noreferrer\">upgrade links</a> and the <a href=\"https://www.digistore24-app.com/vendor/account/conversion_tools/smartupgrade\" target=\"_blank\" rel=\"noopener noreferrer\">smart upgrade widget</a> to fill the placeholders [ORDER_ID] and [UPGRADE_KEY]</td>\n<td>ABCDEFGHI1234567890</td>\n</tr>\n<tr>\n<td>custom_key</td>\n<td>string(23)</td>\n<td>A random key, which is unique for the order. This key is transmitted to DigiMember and DigiBizz and may be used for automated user login.</td>\n<td>1234-Naiy8ahSaiT</td>\n</tr>\n<tr>\n<td>orderform_id</td>\n<td>int</td>\n<td>The ID of order form used for the purchase.</td>\n<td>654321</td>\n</tr>\n<tr>\n<td>payplan_id</td>\n<td>int</td>\n<td>The ID of the selected payment plan.</td>\n<td>123456</td>\n</tr>\n<tr>\n<td>refund_days</td>\n<td>int</td>\n<td>The number of days within a refund is possible. 0= no refund is possible at all. 30 the buyer may refund within 30 days after purchase.</td>\n<td>14</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4MZH4VE62GMZYV4B37M\">Rebilling</h3>\n<p>For <strong>\"billing_type\"</strong> subscription or installments, these extra values are transferred:</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>first_amount</td>\n<td>float</td>\n<td>The gross amount the buyer agreed to pay.</td>\n<td>30.00</td>\n</tr>\n<tr>\n<td>first_vat_amount</td>\n<td>float</td>\n<td>The VAT amount of first_amount.</td>\n<td>4.79</td>\n</tr>\n<tr>\n<td>other_amounts</td>\n<td>float</td>\n<td>The second and following gross amounts the buyer agreed to pay</td>\n<td>30.00</td>\n</tr>\n<tr>\n<td>other_vat_amounts</td>\n<td>float</td>\n<td>For the second and following VAT amounts.</td>\n<td>4.79</td>\n</tr>\n<tr>\n<td>first_billing_interval</td>\n<td>time interval</td>\n<td>The period of time between the first and the second payment.</td>\n<td>7_day</td>\n</tr>\n<tr>\n<td>other_billing_intervals</td>\n<td>time interval</td>\n<td>The period of time between the second and the third payment (and subsequent payments).</td>\n<td>1_month</td>\n</tr>\n<tr>\n<td>next_payment_at</td>\n<td>date</td>\n<td>Date of the next expected payment.</td>\n<td>2016-03-30</td>\n</tr>\n<tr>\n<td>rebill_stop_noted_at</td>\n<td>date</td>\n<td>Date on which the buyer's cancellation request was received.</td>\n<td>2019-03-31</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4MZFVZ8EVTBCBAVMQJ3\">Upgrades</h3>\n<p>For upgrade purchases these additional fields are transferred:</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>upgrade_type</td>\n<td>string(15)</td>\n<td>“upgrade”=Change to more, expensive product, “downgrade”=Change to cheaper product, “special_offer”=Membership Offer, “switch_plan”=Tariff change, “package_change”=Package change</td>\n<td> </td>\n</tr>\n<tr>\n<td>upgraded_order_id</td>\n<td>string(15)</td>\n<td>ID of the “upgraded” order, i.e. the order ID the buyer has purchased the upgrade for.</td>\n<td>1A2B3C4E</td>\n</tr>\n<tr>\n<td>upgraded_order_date</td>\n<td>string(10)</td>\n<td>Date of the upgraded order.</td>\n<td>30.2013-03-31</td>\n</tr>\n<tr>\n<td>upgraded_order_time</td>\n<td>string(8)</td>\n<td>Time of the upgraded order.</td>\n<td>15:57:34</td>\n</tr>\n<tr>\n<td>upgraded_order_date_time</td>\n<td>string(19)</td>\n<td>Date and time of the upgraded order.</td>\n<td>2013-03-31 15:57:34</td>\n</tr>\n<tr>\n<td>upgraded_buyer_id</td>\n<td>int</td>\n<td>ID of the buyer who placed the original order. This is usually the same as the current order, but may be different if the buyer has entered a different name.</td>\n<td>1234</td>\n</tr>\n<tr>\n<td>upgraded_email</td>\n<td>string(63)</td>\n<td> </td>\n<td>user@domain.com</td>\n</tr>\n<tr>\n<td>upgraded_address_first_name</td>\n<td>string(39)</td>\n<td> </td>\n<td>Claus</td>\n</tr>\n<tr>\n<td>upgraded_address_last_name</td>\n<td>string(39)</td>\n<td> </td>\n<td>Meyer</td>\n</tr>\n<tr>\n<td>upgraded_product_id</td>\n<td>int</td>\n<td> </td>\n<td>15332</td>\n</tr>\n<tr>\n<td>upgraded_product_name</td>\n<td>string(63)</td>\n<td> </td>\n<td>Instant Happiness</td>\n</tr>\n<tr>\n<td>upgraded_product_id_2</td>\n<td>int</td>\n<td> </td>\n<td>16331</td>\n</tr>\n<tr>\n<td>upgraded_product_name_2</td>\n<td>string(63)</td>\n<td> </td>\n<td>Wealth – the Guide</td>\n</tr>\n<tr>\n<td>upgraded_product_id_3</td>\n<td>int</td>\n<td> </td>\n<td>12332</td>\n</tr>\n<tr>\n<td>upgraded_product_name_3</td>\n<td>string(63)</td>\n<td> </td>\n<td>The Wealth Action Plan</td>\n</tr>\n<tr>\n<td>and so on</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>delivery_date</td>\n<td>date</td>\n<td>The date, when the new product should be delivered and access to the previous (upgraded) product should be stopped. If empty, access to the new product should be granted immediately.</td>\n<td>(empty) or 2014-03-12</td>\n</tr>\n<tr>\n<td>upgraded_order_paid_until</td>\n<td>date</td>\n<td>For upgrade_type “switch_plan” only. The previous order is paid until this date.</td>\n<td>2014-03-12</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4MZYZT5ACJSWM7V288X\">License Data</h3>\n<p>This section only applies, if Digistore24 delivers a license key together with your product. These data is only transferred for order events, not for other events like affiliation events.</p>\n<p>If no license key is delivered with your product, these parameters are omitted.</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>license_id</td>\n<td>int</td>\n<td>Unique ID for the license.</td>\n<td>12345678</td>\n</tr>\n<tr>\n<td>license_key</td>\n<td>string(255)</td>\n<td>The license key displayed to the customer. The format varies with the creation method.\n<p> </p>\n</td>\n<td>26WBC-694J5-N7BBG-9LN4V-HBD9E-TVPEE-H38F9-D72CB</td>\n</tr>\n<tr>\n<td>license_created</td>\n<td>date</td>\n<td>The date the license key was created.</td>\n<td>2012-12-15 21:09:28</td>\n</tr>\n<tr>\n<td>license_key_type</td>\n<td>enum</td>\n<td>Possible values: list – the key was taken from a list of keys you have uploaded to Digistore24; random – Digistore24 has created the key randomly and unique; remote – Digistore24 has fetched the key from your server via http request</td>\n<td>random</td>\n</tr>\n<tr>\n<td>license_data_first_name license_data_last_name license_data_email license_data_product (for license key type list and random)</td>\n<td>string(each)</td>\n<td>For license key types “list” and “random”, Digistore24 sets the parameters to the values corresponding to the purchase.</td>\n<td> </td>\n</tr>\n<tr>\n<td>license_data_KEY1 license_data_KEY1_label license_data_KEY2 license_data_KEY2_label license_data_KEY3 license_data_KEY3_label …..(for license key type remote)</td>\n<td>string (each)</td>\n<td>For license key type “remote” your license server may deliver license data as key-value pairs. Example: Your name: Myers Your key: ooZai8oh Then Digistore24 adds license data in this way: license_data_XX1=Myers\n<p>license_data_XX1_label=Your name; license_data_XX2=ooZai8oh; license_data_XX2_label=Your key XX1/XX2 are random keys.</p>\n</td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<blockquote class=\"elevio-box-success\">\n<strong>License data and addon products</strong>\n<p>If there is more than one product part of a purchase, then for the second product a “_2” is added to the parameter name, e.g.: license_key_2 For the third addon product, a “_3” is added. And so on.</p>\n</blockquote>\n</div>\n<h3 id=\"h_01JKZJB4MZE7TM106MFEBYWZFM\">Coupon</h3>\n<h4 id=\"h_01JKZJB4MZ11YM51ESM8RVHDQW\">Buying Coupons (Parameter-Table)</h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>coupon_id</td>\n<td>Int</td>\n<td>ID of the coupon.</td>\n<td>12345</td>\n</tr>\n<tr>\n<td>coupon_code</td>\n<td>string(64)</td>\n<td>The code used to redeem the coupon.</td>\n<td>DS11 22AA BB44 55CC DD66</td>\n</tr>\n<tr>\n<td>coupon_amount_total</td>\n<td>float</td>\n<td>The amount of the coupon.</td>\n<td>50.00</td>\n</tr>\n<tr>\n<td>coupon_amount_left</td>\n<td>float</td>\n<td>The unused amount of the coupon.</td>\n<td>17.33</td>\n</tr>\n<tr>\n<td>coupon_currency</td>\n<td>string(7)</td>\n<td>The currency code of the coupon.</td>\n<td>EUR</td>\n</tr>\n<tr>\n<td>coupon_code_2</td>\n<td>string(64)</td>\n<td>The code of the second coupon of the purchase (if applicable).</td>\n<td> </td>\n</tr>\n<tr>\n<td>coupon_amount_total_2</td>\n<td>float</td>\n<td>…</td>\n<td> </td>\n</tr>\n<tr>\n<td>coupon_amount_left_2</td>\n<td>float</td>\n<td>…</td>\n<td> </td>\n</tr>\n<tr>\n<td>coupon_currency_2</td>\n<td>string(7)</td>\n<td>…</td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<h4 id=\"h_01JKZJB4N0GSQC2G3DPEB58WHM\">Using Coupons (Parameter-Table)</h4>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>coupon_id</td>\n<td>Int</td>\n<td>ID of the coupon bought in this purchase.</td>\n<td>12345</td>\n</tr>\n<tr>\n<td>coupon_code</td>\n<td>string(64)</td>\n<td>The code of the coupon bought in purchase.</td>\n<td>DS11 22AA BB44 55CC DD66</td>\n</tr>\n<tr>\n<td>voucher_code</td>\n<td>string(64)</td>\n<td>The tracking voucher code of the coupon.</td>\n<td>coupon_12345</td>\n</tr>\n<tr>\n<td>used_coupon_code</td>\n<td>String(64)</td>\n<td>The coupon code used for this purchase.</td>\n<td>DS11 22AA BB44 55CC DD66</td>\n</tr>\n<tr>\n<td>used_coupon_id</td>\n<td>Int</td>\n<td>The ID of the coupon used for this purchase.</td>\n<td>1122</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4N0RSCFKHEEV97K4CMK\">E-Tickets</h3>\n<p>This section only applies, if Digistore24 delivers E-tickets together with your product. These data are only transferred for order events, not for other events like affiliation events.</p>\n<p>Please note that there is also a separate IPN notification for created and updated E-tickets. The IPN data described here are transferred for the order IPN notifications.</p>\n<p>If no E-ticket is delivered with your product, these parameters are omitted.</p>\n<p>If the user opens the URL in the web browser, he may be asked for his name (if no name is known for the E-ticket). Then the ticket will be saved on his/her computer.</p>\n<p>Please do NOT use instructions like “Right click the link and select save” because the user may not be able to enter his name.</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>eticket_date</td>\n<td>date</td>\n<td>Date of the event (of the 1st product of the order).</td>\n<td>2015-12-27</td>\n</tr>\n<tr>\n<td>eticket_date_2</td>\n<td>date</td>\n<td>Date of the event (of the 2nd product of the order).</td>\n<td>2015-12-27</td>\n</tr>\n<tr>\n<td>eticket_date_3</td>\n<td>date</td>\n<td>Date of the event (of the 3rd product of the order).</td>\n<td>2015-12-27</td>\n</tr>\n<tr>\n<td>and so on</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_hint</td>\n<td>string(127)</td>\n<td>Hint/time on the event (of the 1st product of the order).</td>\n<td>7:00 am (Room 174)</td>\n</tr>\n<tr>\n<td>eticket_hint_2</td>\n<td>string(127)</td>\n<td>Hint/time on the event (of the 2nd product of the order).</td>\n<td>7:00 am (Room 174)</td>\n</tr>\n<tr>\n<td>eticket_hint_3</td>\n<td>string(127)</td>\n<td>Hint/time on the event (of the 3rd product of the order).</td>\n<td>7:00 am (Room 174)</td>\n</tr>\n<tr>\n<td>and so on</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url</td>\n<td>string(255)</td>\n<td>URL to download the E-ticket as an pdf-file (if it is created for the 1st product of the order).</td>\n<td>https://www.digistore24.com/eticket/file009382586171.pdf</td>\n</tr>\n<tr>\n<td>eticket_url_2</td>\n<td>…same for the 2nd product of the order.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_3</td>\n<td>…same for the 3rd product of the order.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>(and so on)</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_B</td>\n<td>2nd E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_C</td>\n<td>3rd E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_D</td>\n<td>4th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>…</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_Z</td>\n<td>26th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZA</td>\n<td>27th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZB</td>\n<td>28th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>…</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZZ</td>\n<td>52nd E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZZA</td>\n<td>53rd E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>…</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZZZ</td>\n<td>78th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_ZZZA</td>\n<td>79th E-ticket of the 1st product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>(and so on)</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_2_B</td>\n<td>2nd E-ticket of the 2nd product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_3_B</td>\n<td>2nd E-ticket of the 3nd product.</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url_4_B</td>\n<td>2nd E-ticket of the 4nd product.</td>\n<td> </td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4N0CJNTHWSQVC5QT23S\">Newsletter subscription</h3>\n<p>On the order form, the user can be asked for a newsletter subscription (see the settings in the product editor, Tab \"Order form\").</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>newsletter_choice</td>\n<td>string(15)</td>\n<td>none = no newsletter optin-checkbox was shown. optin = the buyer checked the newsletter optin-checkbox.optout = the buyer did not check the newsletter optin-checkbox (but it was present on the order form).</td>\n<td>optin</td>\n</tr>\n<tr>\n<td>newsletter_choice_msg</td>\n<td>string(63)</td>\n<td>The selected option as readable text (in the language of the order).</td>\n<td>Newsletter subscribed.</td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4N0W14CNKW9XFTCWD1Z\">\"Customer to Affiliate\"-program</h3>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>customer_affiliate_url</td>\n<td>string(127)</td>\n<td>If you have enabled the “Customers to Affiliates”-program for the purchased main product, this links contains the invitation URL for the customer to become an affiliate. If he follows the URL, a Digistore24 account will be created.</td>\n<td>https://www.digistore24.com/become_affiliate/abc123/xyz789</td>\n</tr>\n<tr>\n<td>customer_affiliate_name</td>\n<td>string(31)</td>\n<td>If the buyer has a Digistore24-account, this is the account name. This does not necessarily mean, that he has established affiliations with your products.</td>\n<td>user12345 supermerchant claus</td>\n</tr>\n<tr>\n<td>customer_affiliate_promo_url</td>\n<td>string(127)</td>\n<td>The promolink for the affiliate.</td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<h3 id=\"h_01JKZJB4N0V9S37MX78K7CJFAS\">IPN-Connection</h3>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_config_id</td>\n<td>The ID of the IPN connection – as it occurs, for example, in the edit link (https://www.digistore24-app.com/vendor/settings/ipn/edit/ID) or is returned by ipnSetup() as ipn_config_id.</td>\n</tr>\n<tr>\n<td>ipn_config_domain_id</td>\n<td>If the IPN connection was created via the Digistore API: The value passed as domain_id for <a href=\"https://dev.digistore24.com/hc/en-us/articles/32616024835729\">ipnSetup()</a>.</td>\n</tr>\n<tr>\n<td>ipn_config_api_key_id</td>\n<td>If the IPN connection was created via the Digistore API: The numerical ID of the API key used. For the API key 12345-xxxxxxx, the ID would be 12345</td>\n</tr>\n<tr>\n<td>ipn_config_products_ids</td>\n<td>“All” (if the connection applies to all products) or the list of product IDs separated with commas – without spaces e.g. 123,456,789</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4N08E5H6XVNQZ6Z6VV3\">Affiliation Event</h2>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_version</td>\n<td>float</td>\n<td>Current version of the IPN-interface</td>\n<td>1.2</td>\n</tr>\n<tr>\n<td>api_mode</td>\n<td>string(4)</td>\n<td>Indicates test mode. Possible value is only <strong>“live“</strong>.</td>\n<td>live</td>\n</tr>\n<tr>\n<td>email</td>\n<td>string(63)</td>\n<td>Email-address of the new affiliate.</td>\n<td>user@domain.com</td>\n</tr>\n<tr>\n<td>affiliate_name</td>\n<td>string(31)</td>\n<td>Digistore24-ID of the new affiliate.</td>\n<td>maxmarketer</td>\n</tr>\n<tr>\n<td>affiliate_link</td>\n<td>string(127)</td>\n<td>The new affiliate’s promolink</td>\n<td>https://promo.123.maxmarketer.digistore24.com</td>\n</tr>\n<tr>\n<td>referring_affiliate_name</td>\n<td>string(31)</td>\n<td>Name of the referring affiliate (if any)</td>\n<td>anothermarketer</td>\n</tr>\n<tr>\n<td>language</td>\n<td>string(2)</td>\n<td>The new affiliate’s language</td>\n<td>de</td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>string(31)</td>\n<td>“affiliate-“, followed by the affiliate-ID.</td>\n<td>affiliate-12345</td>\n</tr>\n<tr>\n<td>order_date</td>\n<td>string(10)</td>\n<td> </td>\n<td>2013-03-31</td>\n</tr>\n<tr>\n<td>order_time</td>\n<td>string(8)</td>\n<td> </td>\n<td>15:57:34</td>\n</tr>\n<tr>\n<td>order_date_time</td>\n<td>string(19)</td>\n<td> </td>\n<td>2013-03-31 15:57:34</td>\n</tr>\n<tr>\n<td>address_first_name</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_last_name</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_id</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_street</td>\n<td> </td>\n<td>Street name and street number. Empty if no address was specified.</td>\n<td>Mainstr. 123a</td>\n</tr>\n<tr>\n<td>address_street_name</td>\n<td> </td>\n<td>Street name only.</td>\n<td>Mainstr.</td>\n</tr>\n<tr>\n<td>address_street_number</td>\n<td> </td>\n<td>Street number only.</td>\n<td>123a</td>\n</tr>\n<tr>\n<td>address_city</td>\n<td> </td>\n<td>Empty if no address was specified.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_state</td>\n<td> </td>\n<td>Empty if no address was specified.</td>\n<td>KlausMeier</td>\n</tr>\n<tr>\n<td>address_zipcode</td>\n<td> </td>\n<td>Empty if no address was specified.</td>\n<td>123456,78900,9865</td>\n</tr>\n<tr>\n<td>address_country</td>\n<td> </td>\n<td>Empty if no address was specified.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_company</td>\n<td> </td>\n<td>Empty if no company was specified.</td>\n<td> </td>\n</tr>\n<tr>\n<td>product_id</td>\n<td> </td>\n<td>Unique ID of the product.</td>\n<td>3323323</td>\n</tr>\n<tr>\n<td>product_language</td>\n<td> </td>\n<td>Language code of the product’s language.</td>\n<td>en</td>\n</tr>\n<tr>\n<td>product_name</td>\n<td>string(63)</td>\n<td>Readable name of the product.</td>\n<td>Fast wealth guide</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4N0HTTJVBCRN31Y9RV8\">E Ticket Event</h2>\n<p><strong>Note:</strong> The address data may be missing, if an E-ticket is created, but no participant data are available. When the buyer enters the participant data, a new IPN-notification is sent with the event <strong>“E-ticket”</strong> and action <strong>“update”</strong>.</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_version</td>\n<td>float</td>\n<td>Current version of the IPN-interface.</td>\n<td>1.2</td>\n</tr>\n<tr>\n<td>api_mode</td>\n<td>string(4)</td>\n<td>Indicates test mode. Possible value is only <strong>“test“</strong>.</td>\n<td>test</td>\n</tr>\n<tr>\n<td>action</td>\n<td>string(15)</td>\n<td>Possible values: create; update; use; cancel_use; revoke; cancel_revoke</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_email</td>\n<td>string(63)</td>\n<td>Email-address of the new affiliate.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_first_name</td>\n<td>string(39)</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_last_name</td>\n<td>string(39)</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_salutation</td>\n<td>string(1)</td>\n<td>Possible values: F – for Mrs. ; M – for Mr.</td>\n<td> </td>\n</tr>\n<tr>\n<td>address_title</td>\n<td>string(31)</td>\n<td> </td>\n<td>Prof. Dr. Dr.</td>\n</tr>\n<tr>\n<td>merchant_id</td>\n<td>int</td>\n<td>Unique ID of the vendor.</td>\n<td> </td>\n</tr>\n<tr>\n<td>merchant_name</td>\n<td>string(31)</td>\n<td>Unique Digistore24-name of the vendor.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>string(31)</td>\n<td>The order-ID followed by a dash and the E-ticket-ID.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_date</td>\n<td>string(10)</td>\n<td>Date of the order.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_time</td>\n<td>string(8)</td>\n<td>Time of the order.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_date_time</td>\n<td>string(19)</td>\n<td>Date and time of the order.</td>\n<td> </td>\n</tr>\n<tr>\n<td>order_is_paid</td>\n<td>string(1)</td>\n<td>Y The order is paid or will be paid soon (in case of subscription or installments). N The order is not paid (e.g. the payment was refunded or charged back).</td>\n<td>Y</td>\n</tr>\n<tr>\n<td>order_billing_status</td>\n<td>string(15)</td>\n<td>Possible values: paying (only for rebilling; Payments are active); aborted; unpaid; reminding; completed (only for single payment and installments. The single payment is completed / All; installment payments are completed)</td>\n<td>completed</td>\n</tr>\n<tr>\n<td>product_id</td>\n<td>int</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>product_name</td>\n<td>string(63)</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>language</td>\n<td>string(2)</td>\n<td>2-letter language code of product.</td>\n<td> </td>\n</tr>\n<tr>\n<td>note</td>\n<td>text</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_id</td>\n<td>int</td>\n<td>Short ID of the E-ticket (unique).</td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_code</td>\n<td>int</td>\n<td>Long ID of the E-ticket (includes the short ID and additionally an authentication code).</td>\n<td>10032261877243293591</td>\n</tr>\n<tr>\n<td>eticket_no</td>\n<td>int</td>\n<td>Number of this E-ticket in the current order position (1 for the first eticket, 2 for the second, …)</td>\n<td>1</td>\n</tr>\n<tr>\n<td>eticket_count</td>\n<td>int</td>\n<td>Total number of E-tickets in the current order position.</td>\n<td>3</td>\n</tr>\n<tr>\n<td>eticket_is_blocked</td>\n<td>string(1)</td>\n<td>Y The eticket has been revoked manually; N The E-ticket is usable.</td>\n<td>N</td>\n</tr>\n<tr>\n<td>eticket_used_at</td>\n<td>date</td>\n<td>Empty (if not used) or a date.</td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_created_at</td>\n<td>date</td>\n<td>Empty (if not used) or a date.</td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_modified_at</td>\n<td>date</td>\n<td>Empty (if not used) or a date.</td>\n<td> </td>\n</tr>\n<tr>\n<td>eticket_url</td>\n<td>url</td>\n<td>The URL to download the E-ticket as a pdf-document.</td>\n<td> </td>\n</tr>\n<tr>\n<td>location_id</td>\n<td>int</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>location_name</td>\n<td>string[63]</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>location_note</td>\n<td>text</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>location_map_image_url</td>\n<td>string[255]</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>location_country</td>\n<td>string[2]</td>\n<td>ISO-Code of the country of the location of the seminar.</td>\n<td>DE</td>\n</tr>\n<tr>\n<td>location_address</td>\n<td>text</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>location_latitude</td>\n<td>string[15]</td>\n<td> </td>\n<td>43.132472</td>\n</tr>\n<tr>\n<td>location_longitude</td>\n<td>string[15]</td>\n<td> </td>\n<td>11.1109412</td>\n</tr>\n<tr>\n<td>location_directions</td>\n<td>text</td>\n<td> </td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4N185PCKQPAPDDD8GS8\">Custom Form Event</h2>\n<p><strong>Note</strong>: The address fields may be missing. They are only added if the custom form contains inputs of an address type (like first name, last name, salutation, street, city and so on).</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_version</td>\n<td>float</td>\n<td>Current version of the IPN-interface.</td>\n<td>1.2</td>\n</tr>\n<tr>\n<td>api_mode</td>\n<td>string(4)</td>\n<td>Indicates test mode. Possible value is only <strong>“test“</strong>.</td>\n<td>test</td>\n</tr>\n<tr>\n<td>action</td>\n<td>string(15)</td>\n<td>Possible value is only <strong>“create“</strong>.</td>\n<td>create</td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>string(31)</td>\n<td>“E-ticket-“ followed by the E-ticket-ID.</td>\n<td>affiliate-1234567890</td>\n</tr>\n<tr>\n<td>order_date</td>\n<td>string(10)</td>\n<td>Date of the order.</td>\n<td>2013-03-31</td>\n</tr>\n<tr>\n<td>order_time</td>\n<td>string(8)</td>\n<td>Time of the order.</td>\n<td>15:57:34</td>\n</tr>\n<tr>\n<td>order_date_time</td>\n<td>string(19)</td>\n<td>Date and time of the order.</td>\n<td>2013-03-31 15:57:34</td>\n</tr>\n<tr>\n<td>address_email</td>\n<td>string(63)</td>\n<td>Email-address of the new affiliate.</td>\n<td>user@domain.com</td>\n</tr>\n<tr>\n<td>address_first_name</td>\n<td>string(39)</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_last_name</td>\n<td>string(39)</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>address_salutation</td>\n<td>string(1)</td>\n<td>Possible values: F – for Mrs.; M – for Mr.</td>\n<td>F</td>\n</tr>\n<tr>\n<td>(and so on)</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>merchant_id</td>\n<td>int</td>\n<td>Unique ID of the vendor.</td>\n<td>39499382</td>\n</tr>\n<tr>\n<td>merchant_name</td>\n<td>string(31)</td>\n<td>Unique Digistore24-name of the vendor.</td>\n<td>KlausMeier</td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>string(31)</td>\n<td>The order-ID followed by a dash, the form id or the form number.</td>\n<td>A1B2D3E4-12345-1</td>\n</tr>\n<tr>\n<td>order_date</td>\n<td>string(10)</td>\n<td>Date of the order.</td>\n<td>2013-03-31</td>\n</tr>\n<tr>\n<td>order_time</td>\n<td>string(8)</td>\n<td>Time of the order.</td>\n<td>15:57:34</td>\n</tr>\n<tr>\n<td>order_date_time</td>\n<td>string(19)</td>\n<td>Date and time of the order.</td>\n<td>2013-03-31 15:57:34</td>\n</tr>\n<tr>\n<td>order_billing_status</td>\n<td>string(15)</td>\n<td>Possible values:paying (only for rebilling; Payments are active); aborted; unpaid; reminding; completed (only for single payment and installments. The single payment is completed / All installment payments are completed)</td>\n<td>completed</td>\n</tr>\n<tr>\n<td>product_id</td>\n<td>int</td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>form_no</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>form_count</td>\n<td> </td>\n<td> </td>\n<td> </td>\n</tr>\n<tr>\n<td>data-XXXXX</td>\n<td>string</td>\n<td>For each field of the custom form, a field data-XXXXX is added, where XXXXX is the (internal) name of the field.</td>\n<td> </td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4N10YXM57P8FFRBRDJK\">Test Event</h2>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>ipn_version</td>\n<td>float</td>\n<td>Current version of the IPN-interface.</td>\n<td>1.2</td>\n</tr>\n<tr>\n<td>api_mode</td>\n<td>string(4)</td>\n<td>Indicates test mode. Possible value is only <strong>“test“</strong>.</td>\n<td>test</td>\n</tr>\n<tr>\n<td>merchant_id</td>\n<td>int</td>\n<td>Unique ID of the vendor.</td>\n<td>39499382</td>\n</tr>\n<tr>\n<td>merchant_name</td>\n<td>string(31)</td>\n<td>Unique Digistore24-name of the vendor.</td>\n<td>JohnSmith</td>\n</tr>\n<tr>\n<td>product_ids</td>\n<td>string(10000)</td>\n<td>Comma-separated list of the vendor's product-IDs (or empty, if the vendor has not yet created any products).</td>\n<td>123456, 123456, 78900,9865</td>\n</tr>\n</tbody>\n</table>\n<h2 id=\"h_01JKZJB4N1GH3CDJ18KAZ8QYA4\">SHA-Signature</h2>\n<p>We add to our request a SHA-512-signature. This allows you to verify the integrity of the transferred data.</p>\n<p><a href=\"https://www.digistore24.com/download/ipn/examples/ipn/sha_sign.php\" target=\"_blank\" rel=\"noopener noreferrer\">Download PHP example script</a>.</p>\n<h4 id=\"h_01JKZJB4N1QV93WXXF04VNR6KX\">Example</h4>\n<p>The ipn request contains these parameters:</p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>buyer_email</td>\n<td>claus@domain-xyz.de</td>\n</tr>\n<tr>\n<td>payment_id</td>\n<td>PAYID-39-22012</td>\n</tr>\n<tr>\n<td>order_id</td>\n<td>273732</td>\n</tr>\n<tr>\n<td>transaction_amount</td>\n<td>17.00</td>\n</tr>\n<tr>\n<td>transaction_currency</td>\n<td>USD</td>\n</tr>\n</tbody>\n</table>\n<p><strong>To create the string to hash</strong></p>\n<ol>\n<li>Put all parameters in one line without line breaks (We have inserted the line breaks for better readability)</li>\n<li>Do not add the parameter <strong>sha_sign</strong> to the hash.</li>\n<li>Sort the parameters by the name (not case sensitive).</li>\n<li>create a SHA512 hash of that string</li>\n</ol>\n<h4 id=\"h_01JKZJB4N148KK5HV5WWP6F4NK\">Example string to hash:</h4>\n<p><code>buyer_email=claus@domain-xyz.dexxxxxorder_id=273732xxxxxpayment_id=PAYID-39-22012xxxxxtransaction_amount=17.00xxxxxtransaction_currency=USDxxxxx</code></p>\n<h4 id=\"h_01JKZJB4N17FF28PCD84EG66B4\">Example signature:</h4>\n<p><code>342770076245D14ED7DF4D2E5D82216D7EDF8F9E7969B5964C9C5DCB53E962BBECD545E90422B5329C69554FD8B1A7E7410736615FCA7FB5CBB3624CC016E4BC</code></p>\n<p>For every IPN call, the SHA-signature is sent as parameter <strong>“sha_sign”.</strong></p>\n</div>","user_segment_ids":[]},{"id":32581926939793,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32581926939793.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32581926939793-Handling-subscriptions","author_id":21855521203985,"comments_disabled":false,"draft":false,"promoted":false,"position":2,"vote_sum":-3,"vote_count":11,"section_id":32544282072977,"created_at":"2025-02-11T13:47:39Z","updated_at":"2026-08-25T01:08:26Z","name":"Handling subscriptions","title":"Handling subscriptions","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-07-02T09:56:06Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>You may use the Digistore24 IPN system for managing subscription and rebilling on your platform - e.g. on your membership area.</p>\n<h2 id=\"h_01JKTM4BP6CZGX4X8GT3PTJVP2\">Handling product access</h2>\n<p>Use these events to manage access to your product based on the customer’s payment status:</p>\n<ul>\n<li>\n<a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">on_payment</a> (name in Digistore24 backoffice: payment): <br>grants access to your product when a payment is successful.</li>\n<li>\n<a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">on_payment_missed</a> (name in Digistore24 backoffice: missed recurring payment):<br>temporarily suspends access when a recurring payment fails (e.g. due to insufficient funds).<br><br><strong>Important: </strong>Do not use this event to handle cancellations or refunds.<br>After the failed payment, several retry attempts are made and the customer is notified via email. If payment ultimately fails, the subscription is automatically cancelled and the event last_paid_day is triggered.</li>\n</ul>\n<p>For subscription cancellations or refunds, use the following event:</p>\n<ul>\n<li>\n<a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">last_paid_day</a> (name in Digistore24 backoffice: end of paid period):<br>signals the end of the paid period (due to cancellation or refund). Use this to permanently revoke access after the last paid day.</li>\n</ul>\n<p>For details on how to set up an IPN connection in Digistore24, see our <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480217565969#h_01JKG19GA24TVRWPV0GASYYQY1\">IPN setup guide</a>.</p>\n<h2 id=\"h_01JKTM4BP6JPACZAB2F6TGXZD5\">Creating accounts</h2>\n<p>These parameters (and others) are sent as IPN data</p>\n<ul>\n<li><a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">email</a></li>\n<li><a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">address_first_name</a></li>\n<li><a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">address_last_name</a></li>\n</ul>\n<p>Create an account for these user data.</p>\n<p>If you want to pass user data to Digistore24, <a href=\"https://dev.digistore24.com/hc/en-us/articles/32581970107793\">please see this article</a>.</p>\n<h2 id=\"h_01JKTM4BP6JP9EX5NASGA3GSZ2\">Accounts and orders</h2>\n<p>When implementing your platform, please be aware that a buyer may have multiple products.</p>\n<p>It’s essential that you store the Digistore24 order id and track the order status for each order id.</p>\n<p>Example:</p>\n<table class=\"elev-table\" style=\"width: 100%;\">\n<thead>\n<tr>\n<th>Step</th>\n<th>Action</th>\n<th>Change</th>\n<th>Event</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>buyer buys product A</td>\n<td>order id AA11AA11 created</td>\n<td>on_payment sent for order AA11AA11</td>\n</tr>\n<tr>\n<td>2</td>\n<td>buyer buys product B</td>\n<td>order id BB22BB22 created</td>\n<td>on_payment sent for order BB22BB22</td>\n</tr>\n<tr>\n<td>3</td>\n<td>buyer cancels AA11AA11</td>\n<td>rebilling stopped for AA11AA11</td>\n<td>on_payment_missed sent for AA11AA11</td>\n</tr>\n</tbody>\n</table>\n<p><br>If you implement product access on an account level, the buyer may end up without product access after step 3.</p>\n<p>Please implement product access on an order level, so that a buyer may have multiple orders.</p>\n<h2 id=\"h_01JKTM4BP68Q7TMEETFW26056X\">Upgrades</h2>\n<p>For upgrades and downgrades, the <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">on_payment_missed</a> event is <strong><em>not</em></strong> sent.</p>\n<p>Access to the new product should be granted at a certain date.</p>\n<p>For upgrade and downgrades, Digistore24 passes these <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">IPN parameters</a>:</p>\n<table class=\"elev-table\" style=\"width: 100%;\">\n<thead>\n<tr>\n<th>Parameter name</th>\n<th>Type</th>\n<th>Description</th>\n<th>Example value</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>upgraded_order_id</td>\n<td>string(15)</td>\n<td>ID of the “upgraded” order, i.e. the order ID the buyer has purchased the upgrade for.</td>\n<td>1A2B3C4E</td>\n</tr>\n<tr>\n<td>delivery_date</td>\n<td>date</td>\n<td>The date when the new product should be delivered and access to the previous (upgraded) product should be stopped. If empty, access to the new product should be granted immediately.</td>\n<td>(empty) or 2014-03-12</td>\n</tr>\n</tbody>\n</table>\n<p><br>Revoke access to the product of the previous order (upgraded_order_id) on the given date (delivery_date).</p>\n<p>At the same time grant access to the new order (order_id).</p>","user_segment_ids":[]},{"id":32488596961425,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32488596961425.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32488596961425-Billing-on-demand","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":2,"vote_sum":-2,"vote_count":4,"section_id":32477029106449,"created_at":"2025-02-07T15:40:18Z","updated_at":"2026-08-09T23:33:05Z","name":"Billing on demand","title":"Billing on demand","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:49:59Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>With billing on demand, payments can be made flexibly and without user interaction.</p>\n<h2 id=\"h_01JKGGYBSYG3QMV9E05E0MJEXH\">Requirements</h2>\n<ul>\n<li>\n<strong>Apply</strong> for the Billing on Demand feature by <a href=\"mailto:support@digistore24.com\" target=\"_blank\" rel=\"noopener noreferrer\">emailing our support</a>.</li>\n</ul>\n<h2 id=\"h_01JKGGYRZFRF8MSCFX6EKJH9T8\">Process</h2>\n<h3 id=\"h_01JKGGYXM45DCJ422PJPHERC5D\">Initiate payments</h3>\n<p>For billing on demand to happen, at least one order with these properties must be available:</p>\n<ul>\n<li>The order must be made with a payment method that allows rebilling (credit card, SEPA direct debit or PayPal).</li>\n<li>Chargebacks, cancellations and order terminations are not available for this order.</li>\n</ul>\n<h3 id=\"h_01JKGGZG1JQGC0NNYK5MQ9AKWX\">Product</h3>\n<p>Create a product that describes the type of rebilling. You can use placeholders to do this such as:</p>\n<p>[COUNT] minutes of video watched on demand.</p>\n<p>This product can, but does not have to, have a payment amount. It can be a 0 EUR product or have a different payment plan.</p>\n<h3 id=\"h_01JKGH0739GKMH82FQJQDQH8EB\">Ensure rebilling payment method</h3>\n<p>There are several options to ensure that the payment method you are using supports rebilling:</p>\n<h4 id=\"h_01JKGH0G92WSSMCQ267PPZS20C\">With the API function createBuyUrl():</h4>\n<p>Select settings[force_rebilling] = Y</p>\n<h4 id=\"h_01JKGH0RN09EKGZSMR9WBW1X45\">Via a GET parameter</h4>\n<p>Add the GET parameter force_rebilling=Y to the order form URL, e.g.:</p>\n<p>https://www.digistore24.com/product/12345?force_rebilling=Y</p>\n<p>After the customer has paid, you can use the order ID as a reference order for billing on demand.</p>\n<h3 id=\"h_01JKGH1691P7RYV5R2PQDYAHHE\">Carry out billing on demand</h3>\n<p>Use the API function <a href=\"https://digistore24.com/api/docs/index.html#/Billing\" target=\"_blank\" rel=\"noopener noreferrer\">createBillingOnDemand()</a> to make any additional payments.</p>","user_segment_ids":[]},{"id":32581970107793,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32581970107793.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32581970107793-Passing-access-data-to-Digistore24","author_id":21855521203985,"comments_disabled":false,"draft":false,"promoted":false,"position":3,"vote_sum":7,"vote_count":27,"section_id":32544282072977,"created_at":"2025-02-11T13:49:23Z","updated_at":"2026-09-18T02:03:50Z","name":"Passing access data to Digistore24","title":"Passing access data to Digistore24","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-03-19T09:10:35Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>Your server's reply to an ipn call should be a simple text.</p>\n<p>To indicate that the call is successful, just return this response:</p>\n<p><code>OK</code></p>\n<p>You may add extra data, e.g.:</p>\n<p><code>\n    OK <br>thankyou_url: https://www.some-domain.com/thank-you <br>username:\n    some-user-name\n  </code> <br><code>\n    password: a-secret-password <br>loginurl:\n    https://www.some-domain.com/login headline: You access data\"\n  </code></p>\n<p>By default, the access data are shown in the Digistore24 order confirmation email and on the invoice.</p>\n<p>To not show the access data on the invoice, add a line:</p>\n<p><code>hide_on: invoice</code></p>\n<h2 id=\"h_01JKTM9Z03S3D6ZP2N5XHXRW5K\">Adding multiple member accounts</h2>\n<p>If you want to create more than one membership account, just add more username/password sets. Append \"_2\" for the second account, \"_3_\" for the third, and so on.</p>\n<p>Example:</p>\n<p><code>\n    OK <br>thankyou_url: https://...<br>username: some-user-name\n  </code> <br><code>\n    password: a-secret-password <br>loginurl:\n    https://www.some-domain.com/login\n  </code> <br><code>username_2: another-user-name</code> <br><code>password_2: another-password</code> <br><code>loginurl_2: https://another-url.com/login</code> <br><code>headline: You access data\"</code></p>\n<h2 id=\"h_01JKTM9Z03AA5AHGBGBER63HFG\">Adding custom data</h2>\n<p>You may add any kind of data.</p>\n<p>The response needs to start with OK.</p>\n<p>You may add any key-value pairs.</p>\n<p>Text needs to be plain text and cannot have HTML tags.</p>\n<p><code>OK</code> <br><code>\n    headline: Your software <br>Your license key: some-key\n  </code> <br><code>Your software package: a package name <br></code></p>","user_segment_ids":[]},{"id":32489203763473,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32489203763473.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32489203763473-Multi-device-affiliate-attribution","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":3,"vote_sum":1,"vote_count":1,"section_id":32477029106449,"created_at":"2025-02-07T16:00:46Z","updated_at":"2026-06-25T21:43:19Z","name":"Multi-device affiliate attribution","title":"Multi-device affiliate attribution","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:52:14Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>Normal affiliate attribution has a drawback because you cannot guarantee that the referred buyer will end up purchasing the product with the same device they used to open the affiliate's promolink.</p>\n<p>As a result, the cookie set in the customer's browser when the promolink was accessed cannot be read if a customer purchases the product on another device - this means that the affiliate is not recognized and thus not remunerated.</p>\n<p>This problem can be solved in three ways provided the customer entered data into an opt-in page before changing the device:</p>\n<ol>\n<li>With the Klick-Tipp feature \"<a href=\"https://www.klick-tipp.com/handbuch/multi-device-tracking\" target=\"_blank\" rel=\"noopener noreferrer\"><strong>Digistore24 multi-device tracking</strong></a>\".</li>\n<li>With the <a href=\"https://help.digistore24.com/hc/en-us/articles/24402185053841\" target=\"_blank\" rel=\"noopener noreferrer\">transmission of the affiliate ID via the autoresponder</a> - this is done by automatically filling out an additional field when subscribing to a newsletter.</li>\n<li>Via a tracking code that automatically stores the affiliate ID in your system.</li>\n</ol>\n<p>To implement the third point on this list, please follow the guide below.</p>\n<h2 id=\"h_01JKGHYSP30N18TDSHJ4G8G3P0\">Example of multi-device affiliate attribution</h2>\n<p>Eric enters data into an autoresponder on his smartphone. This means that he clicks on Anton's Digistore24 promolink on his smartphone and then lands on an opt-in form. The cookie is then set on his smartphone.</p>\n<p>Eric then receives an email. However, he reads it on his PC and clicks on the link to the sales page contained in the email. He then gets to the order form using another link on the sales page. Nevertheless, Digistore24 should know that Anton was the one to refer the product to Eric. This is where multi-device affiliate tracking comes into play.</p>\n<p><img src=\"https://dev.digistore24.com/hc/article_attachments/32489210822673\" alt=\"api-cookbook-multi-device-TGY.png\"></p>\n<h2 id=\"h_01JKGHZYK1EVHQW8KS4XQK2RSB\">Guide</h2>\n<hr>\n<p>These steps are necessary to ensure the affiliate is still recognized for the purchase, even if the buyer switches from their smartphone to their PC.</p>\n<ol>\n<li>Get the Digistore API key</li>\n<li>Embed tracking code into opt-in page</li>\n<li>Enter and save affiliate</li>\n<li>Attach affiliate to order form URL</li>\n</ol>\n<h3 id=\"h_01JKGJ120KN2PZJQVS157FHE13\">1. Get the Digistore API key</h3>\n<p>A description of how to get your users' Digistore API keys in your application <a href=\"https://dev.digistore24.com/hc/en-us/articles/32486158815121\">is given here</a>.</p>\n<h3 id=\"h_01JKGJ1DMCQDDE7SPRXC1WD8BH\">2. Embed tracking code into opt-in page</h3>\n<p>Call up your user's tracking code using the API function <a href=\"https://digistore24.com/api/docs/index.html#/Tracking\" target=\"_blank\" rel=\"noopener noreferrer\">renderJsTrackingCode()</a>.</p>\n<p>To do this, run the following PHP code on your server:</p>\n<p><code> &lt;?php<br>define( 'YOUR_API_KEY', '123-xxxxxxxx'\n    );<br>require_once 'ds24_api.php';<br><br>try {<br>    \n    $api = DigistoreApi::connect( YOUR_API_KEY );<br>    \n    $data = $api-&gt;renderJsTrackingCode();<br>    \n    $api-&gt;disconnect();<br> <br>    \n    $script_code = $data-&gt;script_code;<br>     // Embed\n    this tracking code into the platform user's<br>    \n    // landing page or your software.<br> } catch (DigistoreApiException\n    $e) {<br>     the( $e-&gt;getMessage() );<br> }</code></p>\n<p>The tracking code may look like this:</p>\n<p><code>&lt;script\n    src=\"https://www.digistore24.com/track_info/123/abcdef.js?input=NAME\"&gt;&lt;/script&gt;</code></p>\n<p>Embed this JavaScript code into the page where prospective buyers first visit your platform, e.g. the homepage. Add your own JavaScript code, as described in the next section.</p>\n<h3 id=\"h_01JKGJ1ZF2ME0Y6D2V1XMHKH23\">3. Enter and save affiliate</h3>\n<p>Create a JavaScript code that is also embedded onto the same page. The JavaScript code records the affiliate and stores them together with the buyer data in your database.</p>\n<p>For example:</p>\n<p><code>&lt;script&gt;<br>function myStoreAffiliate( affiliate, campaignkey,\n    tracking_param )<br>{<br>    // store the affiliate here\n    together with the<br>    // data of the prospective\n    buyer.<br>}<br>window.addEventListener('digistore24_affiliate',\n    function (event) {<br>    var affiliate =\n    event.detail.affiliate;<br>    var campaignkey =\n    event.detail.campaignkey;<br>    var tracking_param =\n    event.detail.tracking_param;<br>    myStoreAffiliate(\n    affiliate, campaignkey, tracking_param<br>);<br>}, false);<br>&lt;/script&gt;</code></p>\n<h3 id=\"h_01JKGJ28MTWC41NDC0VH07948S\">4. Attach affiliate to order form URL</h3>\n<p>If you direct the prospective buyer to the Digistore order form, you need to attach the affiliate data to the order form URL:</p>\n<p>https://www.digistore24.com/product/12345/?aff=AFFILIATE&amp;cam=CAMPAIGNKEY&amp;ds24tr=TRACKING_PARAM</p>\n<blockquote class=\"elevio-box-success\">\n<strong>Tip</strong>\n<p>If your user selects the product for the buy button on your platform, you can offer them their own Digistore products to choose from e.g. from a dropdown list. You can get the products via <a href=\"https://digistore24.com/api/docs/index.html#/Products\" target=\"_blank\" rel=\"noopener noreferrer\">listProducts()</a>.</p>\n</blockquote>\n<h2 id=\"h_01JKGJ2K7TBC4VGF4MZ0K7YEST\">See also</h2>\n<ul>\n<li><a href=\"https://dev.digistore24.com/hc/en-us/articles/32479630493585\">Download Digistore API connector for PHP</a></li>\n<li><a href=\"https://dev.digistore24.com/hc/en-us/articles/32486158815121\">Guide: How to generate an API key interactively</a></li>\n<li><a href=\"https://www.digistore24-team.com/account/promopages/device\" target=\"_blank\" rel=\"noopener noreferrer\">Retrieve tracking code manually</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Tracking\" target=\"_blank\" rel=\"noopener noreferrer\">API function: renderJsTrackingCode()</a></li>\n<li><a href=\"https://digistore24.com/api/docs/index.html#/Products\" target=\"_blank\" rel=\"noopener noreferrer\">API function: listProducts()</a></li>\n</ul>","user_segment_ids":[]},{"id":32582197047057,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32582197047057.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32582197047057-Trouble-shooting","author_id":21855521203985,"comments_disabled":false,"draft":false,"promoted":false,"position":4,"vote_sum":6,"vote_count":16,"section_id":32544282072977,"created_at":"2025-02-11T13:54:50Z","updated_at":"2026-09-15T09:45:17Z","name":"Trouble shooting","title":"Trouble shooting","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-02-13T14:32:56Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<h2 id=\"h_01JKTMHGJ21TSWXT5CNBC80646\">Failures and IPN log</h2>\n<p>You find the IPN log in the vendor view under <a href=\"https://www.digistore24-app.com/vendor/reports/ipn\" target=\"_blank\" rel=\"noopener noreferrer\">Reports &gt; Integrations (IPN)</a>.</p>\n<p>There is every IPN request listed – successful as well as failed ones.</p>\n<p>An IPN call is considered a success, if the Digistore24 server receives the text “OK” (upper case, without the quotes) from your server.</p>\n<p>If an IPN call fails, the Digistore24 server will retry for at least 20 times over the next 10 days. The first retry takes place after 3 minutes. If the calls continue to fail, the repeat interval increases up to 24 hours after 10 attempts.</p>\n<h3 id=\"h_01JKTMHGJ3H390PX9TRV4H2NMV\">Repeating IPN calls</h3>\n<p>For several reasons, Digistore24 may repeat IPN calls. Possible reasons are:</p>\n<ul>\n<li>Due to a network or an IPN script error, Digistore24 does not receive a success response (even if the IPN script has processed the IPN process).</li>\n<li>Sometimes IPN calls are repeated manually when orders are fixed manually (e.g., if a buyer paid too much and a refund is issued. Then after the refund, we may initiate another IPN call for the payment to make sure that the buyer has access to their product).</li>\n</ul>\n<blockquote class=\"elevio-box-info\"><strong>Please make sure your IPN script can handle multiple calls for the same IPN event.</strong></blockquote>","user_segment_ids":[]},{"id":32489617516305,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32489617516305.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32489617516305-Delivery-workflow","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":4,"vote_sum":1,"vote_count":1,"section_id":32477029106449,"created_at":"2025-02-07T16:11:22Z","updated_at":"2025-08-28T08:53:51Z","name":"Delivery workflow","title":"Delivery workflow","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-08-28T08:53:51Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>Digistore24 offers an api to connect your fullfillment software. You agents are preparing the packages and handing them over to the parcel delivery service. Via api calls to Digistore24 your software retrieves data on the deliveries and updates the delivery status.</p>\n<p>Using the api, you can make sure</p>\n<ul>\n<li>every delivery is sent excactly once (even if more then one agent is handling the deliveries)</li>\n<li>multiple deliveries for the <a href=\"#h_01JKGJTZT2B05QPZ15G4VPKGQ6\">same address are grouped</a>.</li>\n<li>tracking information is added in Digistore24 and provided to the customer</li>\n<li>partial deliveries are handled correctly</li>\n</ul>\n<h2 id=\"h_01JKGJN4XYEJVC41M9MM26Z580\">Requirements</h2>\n<p>You are selling physical products, which are to be delivered, like books or supplements.</p>\n<p>You have a software managing your delivery process.</p>\n<h2 id=\"h_01JKGJNCF96PDHH69QJGKT71WK\">Background information</h2>\n<p>For every shipped order, Digistore24 creates one or more \"deliveries\".</p>\n<p>Digistore24 creates a delivery for each order position, which is to be shipped. If you have more then one shipped order position on a purchase, you may <a href=\"#h_01JKGJTZT2B05QPZ15G4VPKGQ6\">want to group deliveries</a>.</p>\n<p>Every delivery has a <strong>type</strong> indicating the current status. Possible values for delivery <strong>type</strong> are:</p>\n<ul>\n<li>\n<strong>request</strong> - the order has not been processed. The items are to be sent.</li>\n<li>\n<strong>in_progress</strong> - one of your delivery handling agents is currently dealing with the delivery.</li>\n<li>\n<strong>delivery</strong> - all items of the delivery have been sent</li>\n<li>\n<strong>partial_delivery</strong> - some items of the delivey have been sent</li>\n<li>\n<strong>return</strong> - the package has been returned - maybe the shipping address was wrong</li>\n<li>\n<strong>cancel</strong> - the delivery has been canceled - maybe because of a refund of the purchase</li>\n</ul>\n<h2 id=\"h_01JKGJQ2YVZX4D9F3XJ372KK8R\">Process</h2>\n<h3 id=\"h_01JKGJQ795SKJGYZKW8S96MNDK\">1. Setup product</h3>\n<p>In Digistore24, you need to have a product being sold.</p>\n<p>Make sure, the product type is set correctly to a <a href=\"https://www.digistore24.com/support/product_types#type_shipping\" target=\"_blank\" rel=\"noopener noreferrer\">delivered product type</a> (like a book, a dvd set or supplements).</p>\n<h3 id=\"h_01JKGJQGJ3JA5NSWKT8576PK9C\">2. Retrieve open deliveries via api</h3>\n<p>Use api end point <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">listDeliveries()</a> to get a list of open deliveries.</p>\n<p>To only get open and not completed deliveries, use parameter:</p>\n<p><code>search[type]=request,partial_delivery</code></p>\n<p>Cycle through the list of deliveries, processing <strong>3. Mark delivery as \"in progress\"</strong> for each delivery.</p>\n<h3 id=\"h_01JKGJR9P2R2MF5T5T9DRSE19E\">3. Mark delivery as \"in progress\"</h3>\n<p>To make sure, a delivery is only handeled once, use <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">getDelivery()</a> to set the delivery as being processed. Use parameter</p>\n<p><code>set_in_progress=Y</code></p>\n<p>In Digistore24's response, evaluate <strong>is_set_in_progress</strong></p>\n<ul>\n<li>If <strong>Y</strong>, your agent may process the delivery. Proceed to the next step (<strong>4. Update delivery status</strong>).</li>\n<li>If <strong>N</strong>, your agent should pick the next delivery. Use <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">getDelivery()</a> for the next delivery again.</li>\n</ul>\n<h3 id=\"h_01JKGJSGHJRJK2YB0XJDD86MKZ\">4. Update delivery status</h3>\n<p>Use <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">updateDelivery()</a> to mark the package as shipped and to (optionally) provide parcel tracking data.</p>\n<p>Make sure, you add the quantity of the product delivered:</p>\n<p><code>data[add_quantity_delivered]=N</code></p>\n<p>If - after the api call - no quantity is left to be delivered, then the data[type] is set to: <strong>delivery</strong> - indicating, that the delivery is complete.</p>\n<p>If not all order positions have been delivered, the data[type] ist set to: <strong>partial_delivery</strong> - indicating, that there is a quantity left to be delivered.</p>\n<p>Optionally you may add package tracking information - e.g. tracking[0][parcel_service]=DHL and tracking[0][tracking_id]=123456789 - see <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">updateDelivery()</a> for details.</p>\n<p>Then proceed with <strong>step 3</strong> for the next delivery.</p>\n<h2 id=\"h_01JKGJTPB4ZC9CA0DSN04YDZCC\">Tips and tricks</h2>\n<h3 id=\"h_01JKGJTZT2B05QPZ15G4VPKGQ6\">Pack different order positions in one package</h3>\n<p>To minimize the number of packages sent, search for delivery with the same address.</p>\n<p>Use <a href=\"https://digistore24.com/api/docs/index.html#/Deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">listDeliveries()</a> with these parameters:</p>\n<p><code>search[type]=request,partial_delivery<br>search[same_address_as]=DELIVERY_ID</code></p>\n<p>Replace DELIVERY_ID with the id of a delivery.</p>\n<p>You'll get a list of deliveries shipped to the same address.</p>\n<p>The delivery with the given delivery id is <strong>not</strong> included in the list.</p>\n<h3 id=\"h_01JKGJVHFH46GFB9RKNFC656GB\">Monitoring deliveries in Digistore24</h3>\n<p>In the Digistore24 backoffice, you may monitor the deliveries in the vendor view on <a href=\"https://www.digistore24-team.com/vendor/reports/deliveries\" target=\"_blank\" rel=\"noopener noreferrer\">Reports - Deliveries</a>.</p>","user_segment_ids":[]},{"id":32490319551377,"url":"https://devdigistore24.zendesk.com/api/v2/help_center/en-us/articles/32490319551377.json","html_url":"https://dev.digistore24.com/hc/en-us/articles/32490319551377-Prepaid-token-payments-with-Digistore24","author_id":21104399012497,"comments_disabled":false,"draft":false,"promoted":false,"position":5,"vote_sum":-1,"vote_count":3,"section_id":32477029106449,"created_at":"2025-02-07T16:37:09Z","updated_at":"2025-03-19T09:08:03Z","name":"Prepaid token payments with Digistore24","title":"Prepaid token payments with Digistore24","source_locale":"en-us","locale":"en-us","outdated":false,"outdated_locales":[],"edited_at":"2025-02-18T11:37:18Z","user_segment_id":null,"permission_group_id":12152305040273,"content_tag_ids":[],"label_names":[],"body":"<p>AI assistant applications and SAAS platforms often use prepaid tokens or credits. For example, the user may buy 500 API tokens. If the balance drops below 50 API tokens, another 500 API tokens may be added and billed automatically.</p>\n<h2 id=\"h_01JKGM2GC1FB6W3YMNBZ7JQW6A\">Workflow</h2>\n<p>The workflow for purchasing api tokens is as follows:</p>\n<ol>\n<li>User registers on your platform</li>\n<li>User buys tokens on Digistore24 checkout page and initializes automatic payments</li>\n<li>Digistore24 notifies your platform via Webhook or IPN.</li>\n<li>User spends tokens on your platform</li>\n<li>Optional: If the balance drops below a certain limit, more tokens are billed and added.</li>\n</ol>\n<h2 id=\"h_01JKGM2X99FCA8ZMYHBHJWC4SW\">Code examples</h2>\n<p>In the <a href=\"https://digistore24.com/download/api.zip\">download package of the Digistore24 api connector</a>, you will find PHP code examples.</p>\n<h2 id=\"h_01JKGM39ASDAMNKJ1YYQP9HENF\">1. User registers on your platform</h2>\n<p>The user's first contact is with your platform. Usually you'll want them to create an account there.</p>\n<h2 id=\"h_01JKGM3G760XHM3JYGGJFT0FKZ\">2. User buys tokens on Digistore24 and initializes automatic payments</h2>\n<p>The api function <a href=\"https://dev.digistore24.com/hc/en-us/articles/32553820610705\">createBuyUrl</a> allows you (among other things) to</p>\n<ul>\n<li>create an order form link for a specific product</li>\n<li>adjust the pricing/billing</li>\n<li>add custom parameters</li>\n</ul>\n<p>The Digistore24 API will provide a checkout url. Direct the user to this url to perform the payment.</p>\n<p>Set up a <a href=\"https://www.digistore24-app.com/app/en/vendor/account/products\" target=\"_blank\" rel=\"noopener noreferrer\">Digistore24 product</a> for buying api tokens.</p>\n<h3 id=\"h_01JKGM4FRT4H85G8N78X6GR5KC\">API request:</h3>\n<p>The api request creates a checkout url to bill 50 USD as a single payment from the buyer. Buyer name and email adresse are prefilled.</p>\n<p>Url: https://www.digistore24.com/api/createBuyUrl:</p>\n<p><strong>HTTP header:</strong></p>\n<ul>\n<li>X-DS-API-KEY: <a href=\"https://dev.digistore24.com/hc/en-us/articles/32479630493585\">Your Digistore24 API key</a>\n</li>\n</ul>\n<p><strong>Post data:</strong></p>\n<ul>\n<li>product_id=123</li>\n<li>buyer[email]=some.name@domain.com (optional)</li>\n<li>buyer[last_name]=John (optional)</li>\n<li>buyer[first_name]=Myer (optional)</li>\n<li>payment_plan[first_amount] =50</li>\n<li>payment_plan[other_amounts]=0</li>\n<li>payment_plan[currency]=USD</li>\n<li>tracking[custom]=your-apps-payment-reference</li>\n<li>urls [thankyou_url]=https://www.you-app.com/thankyou</li>\n<li>settings[force_rebilling]=Y (only needed, if you want to use automatic billing in step 5. This excludes wire transfer and other single payment only payment methods.)</li>\n</ul>\n<p>You can see more parameters <a href=\"https://dev.digistore24.com/hc/en-us/articles/32553820610705\">here</a>.</p>\n<h3 id=\"h_01JKGM673NM0G0WDWMANPHMZKV\">Return value:</h3>\n<ul>\n<li>\n<strong>url</strong>: Redirect the user to this url so that they can make the payment.</li>\n</ul>\n<h2 id=\"h_01JKGM6RD891SZMYBR1R09WRSJ\">3. Digistore24 notifies your platform via Webhook or IPN.</h2>\n<p>Either add a <a href=\"https://help.digistore24.com/hc/en-us/articles/23823900323601\" target=\"_blank\" rel=\"noopener noreferrer\">webhook</a> or a <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480217565969\">generic IPN</a> to securely receive the payment status.</p>\n<h3 id=\"h_01JKGM7148JPRY4VM3TE785F9Z\">Webhook</h3>\n<p>For ease of implementation, we recomment this setup.</p>\n<p>In the <a href=\"https://www.digistore24-app.com/vendor/settings/ipn/edit/webhook/new\" target=\"_blank\" rel=\"noopener noreferrer\">webhook setup form</a>, you should enter the parameter name for <em>tracking[custom]</em> next to Custom parameter.</p>\n<p>If the parameter for \"Event\" is \"payment\", book the token, because you received the payment.</p>\n<p>If you later receive an event refund or chargeback, then the payment has been cancelled.</p>\n<h3 id=\"h_01JKGM7B76XJNGX1BDN89EH4E9\">IPN</h3>\n<p>The generic IPN integration is slightly more complex, but it does transfer <a href=\"https://dev.digistore24.com/hc/en-us/articles/32480561422353\">much more data</a>. The value of <em>tracking[custom]</em> is transferred as parameter \"custom\".</p>\n<p>If the parameter \"Event\" is \"on_payment\", book the token, because you received the payment.</p>\n<p>If you later receive on_refund or on_chargeback, then the payment has been cancelled.</p>\n<h2 id=\"h_01JKGM7NF0WYEK39SKJBH8JDK0\">4. User spends tokens on your platform</h2>\n<p>You are responsible for managing the token balance.</p>\n<h2 id=\"h_01JKGM803C3P29M9FNEXYFVHXE\">5. Optional: If the balance drops below a certain limit, more tokens are billed and added</h2>\n<p>In your application, you implement a logic to automatically add new tokens, if the balance drops below a certain limit.</p>\n<h2 id=\"h_01JKGM8E4S43CQTBYWCJ5Z5PYR\">Apply for \"billing on demand\" permission</h2>\n<p>By default, billing on demand is disabled for your account. If you want to use billing on demand, contact our support to enable it. Please add a description of your platform and the current development status or the planned release date to your request.</p>\n<p>When implementing auto recharging, make sure that:</p>\n<ul>\n<li>the user needs to explicitly turn on automatic billing in your application. And that it is turned off by default.</li>\n<li>the user can enter the limit and the amount to his needs. It's ok to have a minimum recharging amount like 50 USD or so.</li>\n</ul>\n<h3 id=\"h_01JKGM98JS1G5D25033N5PY7HY\">API request:</h3>\n<p>This api request bills for 50 USD from the buyer from step 2.</p>\n<p>Url: https://www.digistore24.com/api/createBillingOnDemand</p>\n<p><strong>HTTP header:</strong></p>\n<ul>\n<li>X-DS-API-KEY: <a href=\"https://dev.digistore24.com/hc/en-us/articles/32479630493585\">Your Digistore24 API key</a>\n</li>\n</ul>\n<p><strong>Post data:</strong></p>\n<ul>\n<li>purchase_id=The reference order from step 2.</li>\n<li>product_id=123 (use the same product id as in step 2 or a different one)</li>\n<li>payment_plan[first_amount]=50</li>\n<li>payment_plan[other_amounts]=0</li>\n<li>payment_plan[currency]=USD</li>\n<li>tracking[custom]=your-apps-payment-reference</li>\n</ul>\n<p>You can see more parameters <a href=\"https://dev.digistore24.com/hc/en-us/articles/32553820610705\">here</a>.</p>\n<h3 id=\"h_01JKGMA6P4J45W87HWJVYRZPCC\">Return value:</h3>\n<ul>\n<li>\n<strong>created_purchase_id</strong>: the recharge purchase gets a new order id</li>\n<li>\n<strong>payment_status</strong>:\n<ul>\n<li>completed → payment was successful. Your app may add the tokens to the user's balance.</li>\n<li>any other value: payment failed. Begin at step 2 again.</li>\n</ul>\n</li>\n<li>\n<strong>payment_status_msg</strong>: a human readable description of payment_status.</li>\n</ul>","user_segment_ids":[]}],"sort_by":"position","sort_order":"asc"}