Altcraft variables and functions
Customer profile variables
Profile data variables
Description | Variable |
---|---|
Email address | {lead.email} |
Phone numbers | {lead.phones} |
First name | {lead._fname} |
Last name | {lead._lname} |
Birth date | {lead._bdate} |
Gender | {lead._sex} |
Registration date | {lead._regdate} |
Registration IP | {lead._regip} |
Registration city | {lead._regcity} |
Registration country | {lead._regcountry} |
Registration URL | {lead._regurl} |
IP address | {lead._ip} |
City | {lead._city} |
Country | {lead._country} |
Region | {lead._region} |
Postal code | {lead._postal_code} |
Time zone | {lead._tz} |
Vendor | {lead._vendor} |
Customer ID | {lead._id} |
XXM-hash | {lead._xxm} |
XX-hash | {lead._xxh} |
MD5-hash | {lead._md5} |
*Extra field | {lead.field_name} |
Profiles subscriptions variables
Description | Variable |
---|---|
Subscription email address | {subscription.email} |
Subscription email domain | {subscription.email_domain} |
Subscription email addresses list | {subscription.emails} |
Subscription phone number | {subscription.phone} |
Subscription phone numbers list | {subscription.phones} |
Push subscriptions list | {subscription.pushes} |
Email address MD5 hash | {subscription.email_md5} |
Phone number MD5 hash | {subscription.phone_md5} |
Subscription hash | {subscription.hash_id} |
Custom subscription field | {subscription_field("channel" "field_name" resource_id)}channel - a string indicating the channel ("email")field_name - the name of the field to insert ("domain")resource - resource identifier(10) |
The subscription_field
function allows you to insert fields from subscriptions, regardless of the channel used in the current message. For example, if a profile has an SMS subscription, you can substitute its phone number in the email version of the message: {subscription_field("sms" "phone")}
.
If more than one subscription matches the conditions, the platform selects the subscription with the highest priority.
Available fields for substitution:
Channel | Field | Description |
---|---|---|
Subscription email address | ||
domain | Subscription email domain | |
domain_group | Domain group | |
md5 | Email address MD5 hash | |
sms | phone | Subscription phone number |
md5 | Phone number MD5 hash | |
push | subscription_id | Push subscription ID |
bundle_id | App ID for iOS APNs | |
provider | Push provider |
In the same way, you can substitute data from custom channel subscriptions into the template. The fields of custom channels correspond to the sid of the fields that you specify when creating the channel.
Profile relations
General variable formula:
{relation.[short_relation_name].[direct or reverse].[property_name].[count, total, top]}
The number of direct relations with the "profit"
property:
{relation.managers_loyal.direct.profit.count}
Top of the reverse relations with the "profit"
property. A loop is used to output multiple values:
{for $index $item = relation.managers_loyal.reverse.profit.top}
{$item.lead._fname} {$item.lead._lname} ({$item.value} profit)
{else}
There is no ‘profit’ for you :(
{end}
The sum of the "profit"
property value for the direct relation:
{relation.managers_loyal.direct.profit.total}
Date and time variables
Description | Variable | Example |
---|---|---|
Formatted date | {format} | {format datenow "%Y-%m-%D %H:%M:%S timezone, %I am"} 2018-12-24 18:56:10 +03:00, 6 pm |
Unformatted date | {datenow} | 2018-12-24T18:56:10+0300 |
Date shift | {adddate()} | {adddate(datenow 0 0 3)} 2018-12-27T18:56:10+0300 |
Full year | {yearlong} | 2018 |
Year | {year} | 18 |
Month | {month} | 12 |
Day | {day} | 10 |
Hours in 24-hour format | {hours} | 18 |
Hours in 12-hour format | {hours12} | 06 |
«A. M.», «P. M.» | {ampm} | PM |
Minutes | {minutes} | 56 |
Seconds | {seconds} | 10 |
Extra variables
Description | Variable |
---|---|
API content | {apicontent.field_name} |
SMS sender name | {from_name_sms} |
Pixel for letter opening tracking | {pixel} |
Pixel for letter reading tracking | {read} |
Resource ID | {resid} |
Database name | {listname} |
Database ID | {listid} |
Message name | {msgname} |
Message ID | {msgid} |
Message type | {msg_type} |
Message sending cancel | {cancel} |
Tracking domain | {trkdomain} |
Campaign name | {campname} |
Campaign ID | {campid} |
Campaign SUBID | {subid} |
Adding to the suppression list | {suppress} |
Subscription manager URL | {preferences} |
Unsubscription URL | {unsubscribe} |
Global unsubscription URL | {globalunsubscribe} |
Editor functions
Date formatting
Information of "date" type have different display in different countries. For subscribers convenience there is date formatting function.
For example, to display subscribers birth date as:
Date of Birth 02.11.1998
You can use this function:
<p>Date of Birth {format lead._bdate "%D.%m.%Y"}</p>
All examples of date formatting:
# years
"%y": "06"
"%Y": "2006"
"yy": "06"
"YYYY": "2006"
# months
"%m": "01"
"MM": "01"
"%B": "January"
"month": "January"
# days
"%d": "2"
"%D": "02"
"DD": "_2"
"%A": "Monday"
"weekday": "Monday"
# hours
"%H": "15"
"%I": "3"
"hh": "15"
"hours": "15"
"twelve_h": "3"
# mins
"%M": "04"
"mm": "04"
# seconds
"%S": "05"
"ss": "05"
# am/pm indicator
"am": "pm"
"AM": "PM"
"%p": "pm"
# timezone
"tzone": "-07"
"timezone": "-07:00"
"%Z": "Z0700"
To insert a function, press </>
button in template editor and select Date&time → Formatted datetime.
Date shifting
adddate(date, year, month, day)
function returns date value after it adds certain interval to it.
<p>Event starts on {adddate(lead.notify_date 0 0 10)}</p>
adddate()
can be used inside format()
function.
<p>Event starts on {format adddate(lead.notify_date 0 0 10) "%Y-%m-%D"}</p>
To insert a function, press </>
button in template editor and select Date&time → Date shifting.
Price formatting
Also, there is function of number data format, which divides number to blocks by three digits using selected delimiter.
Price 8.000 RUR
<p>Price {format json.price "."} RUR</p>
To insert a function, press </>
button in template editor and select Output functions → Format.
Encryption and hashing
If you want to send template content and variables in encrypted or hashed type, you can use crypt
function in the templates editor. To use it, press </>
button in the templates editor and select Encryption.
You can change coding or encrypt data using one of these algorithms:
- base58
- base64
- sha1
- sha256
- aes
- blowfish
For sha1 and sha256 you can add salt. For AES and Blowfish you can use key in base64 coding as salt.
AES and Blowfish encryption details:
AES | Blowfish | |
---|---|---|
Initialization vector | First 16 bytes of the string | First 8 bytes of the string |
Encryption mode | CFB (Cipher Feedback) | CBC (Cipher Block Chaining) |
Key length | 128 bits — 16 symbols | 64 bits — 8 symbols |
Padding | null | null |
Encryption / decryption is done via Base64URL encoding.
Below, there are syntax examples for changing coding and encryption.
{crypt(base58 lead._fname)}
{crypt(base64 lead._lname)}
{crypt(sha256 lead.custom_field "salt")}
{crypt(sha1 lead._city "salt")}
{crypt(aes lead.score "key1234567891234")}
{crypt(blowfish lead._tz "key12345")}
If you want to encrypt one line of text, you need to put it into quotes. If it is number, you do not need to use quotes:
{crypt(base58 "value")}
{crypt(base64 42)}
These algorithms are available for hashing. You can use salt for each of them:
- md5 + salt
- xxh32 + salt
- xxh64 + salt
They use same syntax like encryption functions:
{crypt(md5 subscription.email "salt")}
{crypt(xxh32 loyalty.new2.promocode "salt")}
{crypt(xxh64 json.text "salt")}
Note that the encrypted data will already be encoded in base64.
Output functions
Description | Variable | Example |
---|---|---|
Formatting | format | {format 1000000000 ","} 1,000,000,000 |
Variable length | length | {length("abc")} 3 |
Array | array | {array[1 "2" 3.3]} [1 2 3.3] |
Random array element | randomize | {randomize(array[1 2 3])} 1 |
Array limit | limit | {limit(array[1 2 3] 2)} [1 2] |
Even number | iseven | {iseven(2)} => true{iseven(3)} => false |
URL-address coding | urlencode | {urlencode(lead._regurl)} http:%2F%2Ftest.testdomain.com%2Fsomething Used to encode unsupported characters in URL parameters. |
URL-address decoding | urldecode | {urldecode(lead._regurl)} http://test.testdomain.com/something |
Uppercase | uppercase | {uppercase("text")} TEXT |
First character in uppercase | uppercasefirst | {uppercasefirst("john")} John |
Logical expressions
Using logical expressions in described in a dedicated article.
This construction is used to create the simplest condition:
{if lead.age gte 18}
If 18 years and older.
{else}
If younger than 18.
{end}
Loops
Using cycles is describes in a dedicated article.
External JSON
Described in Using JSON content in the messages.
Market variables
Described in Market variables in templates.
Fragments
Using fragments is described in a dedicated article.
To insert a fragment, use {fragment.<fragment_short_name>}
To insert a random fragment from a set range: {randomfragment[fragment.name1 fragment.name2 fragment.name3]}
JSONPath
The JSONPath query language allows you to quickly and easily access JSON objects from dynamic content source.
The JSONPath variable on the Altcraft platform is specified as follows: {jsonpath(json.<root_object> "<path_to_object>" "<output_format>")}
The usage of JSONPath functionality is described in this article.