3. Conversion upload API

For the full documentation please visit: https://docs.dripcel.com


Sales and/or Conversion can be uploaded via a POST request or the traditional, postback-via-URL, GET request.


To post a sale back you will need:

  • API key with the required permissions: ["sale.create"]

  • One of either: campaign_id or send_id or click_id to match the sale back to the correct campaign. If you use more than one of these IDs your upload will fail.

  • The cell of the associated sale

  • The soldAt date if applicable (If blank, the current datetime is used)

  • As well as the saleValue (If no saleValue is present, the defaultSaleValue of the corresponding campaign will be used).


Note: If the sales you are uploading are from Campaigns V2, you need to send the cell in international phone number format, example, South Africa: 27631231234.


GET REQUEST / POSTBACK URL

url: POST https://api.dripcel.com/sales/create

This is used to post single sales back, if you want to upload multiple sales, use the POST request.


Note: If a timestamp is included in in soldAt it must be encoded.


Non-encoded: 2025-10-14 16:47:36 | Encoded: 2025-10-14%2016%3A47%3A36


Example (No Timestamp)

https://api.dripcel.com/sales/create?key=KEY&soldAt=2025-10-14&campaign_id=CAMPAIGN_ID&cell=27112223333


Example (Encoded Timestamp)

https://api.dripcel.com/sales/create?key=KEY&soldAt=2025-10-14%2009%3A02%3A51&campaign_id=CAMPAIGN_ID&cell=27112223333


POST REQUEST / Bulk

url: GET https://api.dripcel.com/sales


Body

type Sales = {
  /** The campaign ID associated with the sale */
  campaign_id: string;
  /** The send_id ID associated with the sale */
  send_id: string;
  /** The click_id ID associated with the sale */
  click_id?: string;
  /** The cell number of the contact who converted the sale. Can be in local or international format (if local, the country of the corresponding campaign will be used) */
  cell: string;
  /** The date the sale was made. Must be in ISO format (YYYY-MM-DD), and doesn't have to include time. If blank, the current datetime is used. */
  soldAt?: string;
  /** The value of the sale. If blank, the `defaultSaleValue` of the corresponding campaign will be used */
  saleValue?: number;
}[];


Headers

{ "Authorization": "Bearer <key>" }


Example

[
  {
    "cell": "0111111111",
    "campaign_id": "639978184d735c88ed8bbd68"
  },
  {
    "saleValue": 100,
    "cell": "0111111112",
    "soldAt": "2023-02-14",
    "campaign_id": "639978184d735c88ed8bbd68",
  }
]


Response

Success

{
  ok: true;
}

Error

{
  ok: false;
  error: "Campaign not found";
}
{
  ok: false;
  // A sale is considered a duplicate if it has the same cell number, campaign_id, and soldAt date as an existing sale
  error: "Duplicate sale";
}