INHALTSVERZEICHNIS
Overview
The purpose of this feature is to provide the clients with the possibility of setting up custom WebHooks linked to campaign state changes in order to report campaign and recipient information back into customers CRM.
When a campaign changes its state, e.g. from draft to live (campaign was booked) or print to live (handover to postal service), the system will trigger a request to a specific endpoint called with a specific payload.
A configured web hook is defined by:
triggering state transition
type of web hook (defines available data)
request target definition
payload template
State transitions
Most common used transitions are:
campaign was booked
campaign was reviewed successfully and print starts
campaign was handed over to postal service
Web Hook types
There are 4 different type of web hook available which are providing access to different data usable as request payload.
Campaign
Campaign web hook are triggered once per state change of the campaign and provide the following data:
name
state
type
accountName
accountConnectionType
countryName
countryCode
createdDate
createdWeek
createdMonth
bookingDate
bookingWeek
bookingMonth
postalHandoverDate
postalHandoverWeek
postalHandoverMonth
variationsCount
productsCount
hasEnvelope
volume
customerAddressVolume
controlAddressVolume
volumePerVariation
customerAddressVolumePerVariation
controlAddressVolumePerVariation
pricing.print
pricing.postage
pricing.premiumValidation
pricing.total
pricing.vatRate
pricing.vat
pricing.grossAdditional data regarding configured products within the campaign are available on request.
Variation
Variation web hook are triggered once for each variation defined in the campaign per state change of the campaign and provide the same data as for type Campaign except variationsCount plus:
variationIdAll volume and pricing values are per variation.
Recipients
Recipients web hook are trigger for all recipients in multiple batches per state change of the campaign and provide the same data as for type Campaign (under prefix “campaign.”) plus the following data per recipient (array of objects in “recipients”):
  variationIndex
  vouchers.code
  vouchers.itemIndex
  vouchers.voucherIndex
  externalId
  lineNumber
  addressSource.origin
  addressSource.sourceRef
  changes
  warns.field
  warns.message
  errs.field
  errs.message
  address.companyName1
  address.companyName2
  address.companyName3
  address.title
  address.otherTitles
  address.jobTitle
  address.gender
  address.firstName
  address.lastName
  address.fullName
  address.careOf
  address.street
  address.houseNumber
  address.address1
  address.address2
  address.address3
  address.zipCode
  address.city
  address.country
  address.individualisationsA batch size (how many recipients will be sent in 1 request) must be defined. For every triggered web hook request, the variable “recipients” will contain only the number of recipients as defined by batch size.
ExcludedCustomerAddress
ExcludedCustomerAddress web hook are trigger for all customer addresses which have not been included into the campaign due to validation errors or because they are flagged with a warning which was marked as “excluded”. Like Recipients they are triggered in multiple batches per state change of the campaign and provide the same data as for type Campaign (under prefix “campaign.”) plus the following data per excluded customer address (array of objects in “excludedCustomerAddress”):
  address.addressNameCounter
  address.jobTitle
  address.title
  address.otherTitles
  address.gender
  address.firstName
  address.lastName
  address.fullName
  address.companyName1
  address.companyName2
  address.companyName3
  address.individualisations
  address.street
  address.houseNumber
  address.careOf  
  address.zipCode  
  address.city  
  address.country
  address.address1
  address.address2
  address.address3
  individualVouchers.code
  individualVouchers.columnName 
  variationIndex
  externalId
  lineNumber
  addressSource.origin
  addressSource.sourceRef
  changes
  warns.field
  warns.message
  errs.field
  errs.messageA batch size (how many excluded customer addresses will be sent in 1 request) must be defined. For every triggered web hook request, the variable “recipients” will contain only the number of excluded customer addresses as defined by batch size.
Supported request targets
SalesForce Marketing Cloud
The web hook triggers a request to the SFMC API for upserting data into a data extension. Authentication in SFMC API is controlled by optilyz.
The following information are required:
CustomerKey of the data extension to update
one or multiple data extension field names and the corresponding optilyz field (see list of provided data above) to be used to identify (lookup) the particular row to be updated
one or multiple data extension field names and the corresponding optilyz field (see list of provided data above) to be used for actually updating (setting) data
example:
Data Extension CustomerKey:
"988050E5-C613-4A91-841E-31B339C4297F"
Lookup Fields:
data extension field name  | optilyz field name  | static value  | 
|---|---|---|
subscriberKey  | recipients.externalId  | |
campaign  | “reactivation”  | 
Update Fields:
data extension field name  | optilyz field name  | static value  | 
|---|---|---|
cost  | campaign.pricing.total / campaign.volume  | |
shopId  | recipients.address.individualisation1  | |
foo  | “bar”  | 
Emarsys
The web hook triggers a request with JSON payload to the Emarsys API. Authentication in Emarsys API is controlled by optilyz automatically, no specific headers are needed. All available calls according to Emarsys API documentation can be executed: https://dev.emarsys.com/v2/emarsys-developer-hub
The following information are required:
method - the https request method
GET
POST
PUT
endpoint - the Emarsys API endpoint (e.g. “/contact”)
body template - the body of the request (data from the dataSource may be used) - only for methods POST and PUT
Additional optional information:
headers template - the custom headers that the request target endpoint may want to use (data from the dataSource may be used)
query-params template - the custom query variables that the client may want to use (data from the dataSource may be used)
AWS API Gateway
The web hook triggers a AWS API Gateway request with custom JSON payload.
The following information are required:
method - the https request method
GET
POST
PUT
region - the AWS API Gateway region
endpoint - the AWS API Gateway endpoint URL
accessKey - the AWS API Gateway accessKey
secretKey - the AWS API Gateway secretKey
body template - the body of the request (data from the dataSource may be used) - only for methods POST and PUT
Additional optional information:
headers template - the custom headers that the request target endpoint may want to use (data from the dataSource may be used)
query-params template - the custom query variables that the client may want to use (data from the dataSource may be used)
REST
The web hook triggers a https request with custom JSON payload. Authentication has to be handled through headers and/or query params.
The following information are required:
method - the https request method
GET
POST
PUT
url - the url of the request, HTTPS only
body template - the body of the request (data from the dataSource may be used) - only for methods POST and PUT
Additional optional information:
headers template - the custom headers that the request target endpoint may want to use (data from the dataSource may be used)
query-params template - the custom query variables that the client may want to use (data from the dataSource may be used)
Template examples
Body template
{
    "campaign": {
      "name": "{{campaign.name}}",
      "accountName": "{{campaign.accountName}}",
      "countryName": "{{campaign.countryName}}",
      "countryCode": "{{campaign.countryCode}}",
      "createdDate": "{{campaign.createdDate}}",
      "bookingDate": "{{campaign.bookingDate}}",
      "postalHandoverDate": "{{campaign.postalHandoverDate}}",
      "variationsCount": "{{campaign.variationsCount}}",
      "productsCount": "{{campaign.productsCount}}",
      "hasEnvelope": "{{campaign.hasEnvelope}}",
      "volume": "{{campaign.volume}}",
      "pricing_print": "{{campaign.pricing.print}}",
      "pricing_postage": "{{campaign.pricing.postage}}",
      "pricing_premiumValidation": "{{campaign.pricing.premiumValidation}}",
      "pricing_total": "{{campaign.pricing.total}}",
      "pricing_vat": "{{campaign.pricing.vat}}",
      "pricing_gross": "{{campaign.pricing.gross}}",
      "vatRate": "{{campaign.pricing.vatRate}}"
    },
    "recipients": [
      {{#each recipients}}
        { 
          "CUSTOMER_ID": "{{address.individualisations.[0]}}",          
          "SHOP_ID" : "{{address.individualisations.[1]}}",
          "USERID" : "{{address.individualisations.[2]}}",
          "variationIndex": "{{variationIndex}}",
          "lineNumber": "{{lineNumber}}",
          "sourceRef": "{{addressSource.sourceRef}}",
          "warns": [
            {{#each warns}}
              {
                "field": "{{field}}",
                "message": "{{message}}"
              }
              {{#unless @last}},{{/unless}}
            {{/each}}
          ]
        }
        {{#unless @last}},{{/unless}}
      {{/each}}      
    ],
    "excludedCustomerAddresses": [
      {{#each excludedCustomerAddresses}}
        { 
          "CUSTOMER_ID": "{{address.individualisations.[0]}}",          
          "SHOP_ID" : "{{address.individualisations.[1]}}",
          "USERID" : "{{address.individualisations.[2]}}",
          "variationIndex": "{{variationIndex}}",
          "lineNumber": "{{lineNumber}}",
          "sourceRef": "{{addressSource.sourceRef}}",
          "warns": [
            {{#each warns}}
              {
                "field": "{{field}}",
                "message": "{{message}}"
              }
              {{#unless @last}},{{/unless}}
            {{/each}}
          ],
          "errs": [
            {{#each errs}}
              {
                "field": "{{field}}",
                "message": "{{message}}"
              }
              {{#unless @last}},{{/unless}}
            {{/each}}
          ]
        }
        {{#unless @last}},{{/unless}}
      {{/each}}      
    ]
  }Headers template
{ "Authorization": "Basic abc123" }Query-params template
{ "countryName": "{{countryName}}", "bookingMonth": "{{bookingMonth}}" }