Segment

Overview

Segment is a platform that captures and stores all first-party customer data regarding your product or service in a centralized place. More specifically, Segment collects events from your interfaces (websites, web apps, etc.), and from that information, helps you create more personalized customer experiences across various channels.

We will plug Lob into our Segment flow by making a custom destination function. Destinations are business tools or apps to which you can send the data you collect in Segment. Depending on which mailpiece form factor you want to send (postcard, letter, etc.), building a destination function that sends it merely involves reading the data and calling Lob’s API. These steps are outlined below.

Getting Started

Connect Segment to Lob using Destination Functions:

  1. In the sidebar, navigate to “Connections” -> “Catalog,” and then click the Functions tab:

  1. Click the “New Function” button:

  1. Under “Select Function Type,” click “Destination,” and then click “Build”:

  1. Enter your Javascript code in the editor on the left, and test your function on the right; refer to the following section on form factors for details. Click “Configure” when done:

  1. Give the function a name (required), description, and logo, and click “Create Function” to save:

Segment Events by Mail Form Factor

The following are sample functions to send a Lob mailpiece from a given Segment event, organized by mailpiece. Segment provides six different event types that destination functions can operate on:

  • Identify: who is the customer?

  • Track: what are they doing?

  • Page: what web page are they on?

  • Screen: what app screen are they on?

  • Group: what account or organization are they part of?

  • Alias: what was their past identity?

The following sample code translates Track events into Lob mailpieces by defining an onTrack function. (For other functionalities, just define a similarly named function, e.g., onPage for Page events.)

Postcards
/**
* @param {SpecTrack} event The track event
* @param {Object.<string, any>} settings Custom settings
* @return any
*/
async function onTrack(event, settings) {
 const body = {
   description: 'Description of the card,'
   to: {
     name: event.properties.name,
     address_line1: event.properties.address.line1,
     address_line2: event.properties.address.line2,
     address_city: event.properties.address.city,
     address_state: event.properties.address.state,
     address_zip: event.properties.address.zip
   },
   front:
     "<html style='padding: 1in; font-size: 50;'>Front side for {{name}}</html>",
   back: "<html style='padding: 1in; font-size: 20;'>Back side for {{name}}</html>",
   merge_variables: {
     name: event.properties.name
   }
 };


 const response = await fetch('https://api.lob.com/v1/postcards', {
   method: 'POST',
   headers: {
     Authorization: `Basic ${btoa(settings.apiKey + ':')}`,
     'Content-Type': 'application/json'
   },
   body: JSON.stringify(body)
 });


 return response.json();
}

Letters
/**
* Handle track event
* @param  {SegmentTrackEvent} event
* @param  {FunctionSettings} settings
*/
async function onTrack(event, settings) {
 const body = {
   description: 'Description of the letter',
   to: {
     name: event.properties.name,
     address_line1: event.properties.address.line1,
     address_line2: event.properties.address.line2,
     address_city: event.properties.address.city,
     address_state: event.properties.address.state,
     address_zip: event.properties.address.zip
   },
   from: {
     name: event.properties.return_addr.name,
     address_line1: event.properties.return_addr.line1,
     address_line2: event.properties.return_addr.line2,
     address_city: event.properties.return_addr.city,
     address_state: event.properties.return_addr.state,
     address_zip: event.properties.return_addr.zip
   },
   file: "<html style='padding: 1in; font-size: 50;'>Front side for {{name}}</html>",
   color: 'false',
   use_type: 'marketing',
   merge_variables: {
     name: event.properties.name
   }
 };


 const response = await fetch('https://api.lob.com/v1/letters', {
   method: 'POST',
   headers: {
     Authorization: `Basic ${btoa(settings.apiKey + ':')}`,
     'Content-Type': 'application/json'
   },
   body: JSON.stringify(body)
 });


 return response.json();
}
Self Mailers
/**
* Handle track event
* @param  {SegmentTrackEvent} event
* @param  {FunctionSettings} settings
*/
async function onTrack(event, settings) {
 const body = {
   description: 'Description of the self-mailer',
   to: {
     name: event.properties.name,
     address_line1: event.properties.address.line1,
     address_line2: event.properties.address.line2,
     address_city: event.properties.address.city,
     address_state: event.properties.address.state,
     address_zip: event.properties.address.zip
   },
   inside:
     "<html style='padding: 1in; font-size: 50;'>Inside side for {{name}}</html>",
   outside:
     "<html style='padding: 1in; font-size: 20;'>Outside side for {{name}}</html>",
   use_type: 'marketing',
   merge_variables: {
     name: event.properties.name
   }
 };


 const response = await fetch('https://api.lob.com/v1/self_mailers', {
   method: 'POST',
   headers: {
     Authorization: `Basic ${btoa(settings.apiKey + ':')}`,
     'Content-Type': 'application/json'
   },
   body: JSON.stringify(body)
 });


 return response.json();
}
Checks
/**
* Handle track event
* @param  {SegmentTrackEvent} event
* @param  {FunctionSettings} settings
*/
async function onTrack(event, settings) {
 const body = {
   description: 'Description of the check',
   to: {
     name: event.properties.name,
     address_line1: event.properties.address.line1,
     address_line2: event.properties.address.line2,
     address_city: event.properties.address.city,
     address_state: event.properties.address.state,
     address_zip: event.properties.address.zip
   },
   from: {
     name: event.properties.return_addr.name,
     address_line1: event.properties.return_addr.line1,
     address_line2: event.properties.return_addr.line2,
     address_city: event.properties.return_addr.city,
     address_state: event.properties.return_addr.state,
     address_zip: event.properties.return_addr.zip
   },
   bank_account: 'bank_a4fc08e61e12c6c',
   message: 'INSERT MESSAGE HERE',
   amount: 0, //Insert an amount here
   use_type: 'marketing',
   merge_variables: {
     name: event.properties.name
   }
 };


 const response = await fetch('https://api.lob.com/v1/checks', {
   method: 'POST',
   headers: {
     Authorization: `Basic ${btoa(settings.apiKey + ':')}`,
     'Content-Type': 'application/json'
   },
   body: JSON.stringify(body)
 });


 return response.json();
}

Remember to test your mail sent through Segment by using your test API key first. Once you do, plug in your live key, and enjoy sending intelligent, automated mail pieces with Lob and Segment!

Conclusion

Given how useful Segment is for integrating multiple different interfaces for collecting and operating on customer data, this tutorial gives us the ability to add Lob as one of many possible powerful tools for accomplishing data-driven, instantaneous operations on that data. Luckily, plugging Lob into Segment is as easy as making a destination function and using it in your workflows.

Resources

Here are two other resources that might help with crafting your workflow:

Last updated