探索如何利用 Marketo Engage REST API 來自動化行銷營運任務。本文將涵蓋 Marketo Engage 管理員常見的使用案例,包括簡化行銷活動建立流程、回復不想要的數據變更,以及將參與度分析轉化為可執行的銷售行動。
我擁有應用與計算數學的背景,這讓我與大多數 Marketo Engage 的從業者有所不同。當我開始從事行銷營運工作時,我意識到很多工作其實都可以自動化。 自動化可讓我的工作更有效率,並加快事業成長。 利用 API 來自動化日常營運工作,讓我能夠專注於更具策略性的議題,而不是埋首於繁瑣的營運任務中。
在本文中,我將分享我如何使用 Marketo Engage REST API,並介紹我最喜愛的三個使用案例,以展示其強大的功能。讓我展示 REST API 如何成為您在 Marketo Engage 中提升效率的得力助手,讓您有更多時間專注於策略性事務。
- 使用案例1 — 簡化行銷活動建立: 您花多少時間在 Marketo Engage 行銷活動的建立上?我敢打賭,這個過程至少會消耗您每天 2 小時的時間,而且根據您的職業階層,這個數字很可能還會更高。但這項任務最糟糕的地方在於,90% 的行銷活動建立工作都是手動操作,從複製到貼上,無一不是。因此,這項任務非常適合自動化!
- 使用案例 2 — 回復不想要的數據變更: 處理髒數據是行銷營運團隊的噩夢。您收到一份包含許多垃圾值的列表,卻在未事先清理的情況下就進行了匯入。也許您當時太忙了,根本沒注意到這個問題。當您在 Marketo Engage 資料庫中看到結果時,心都涼了半截。別擔心,讓我來展示如何使用像 REST API 這樣高效的方法,快速修復糟糕的清單匯入問題。
- 使用案例3 — 將深入分析轉化為銷售行動: 您有多少次遇到銷售代表問您:「為什麼這個銷售機會被標記為 MQL?這個人對哪些議題有興趣?」要回答這些問題,您必須深入查看活動記錄,以找出某個人被判定為 MQL 的原因。在下面的演示部分,您將學習如何使用 REST API 來自動化這個數據轉化流程。
現在,請坐穩了,準備好了解我如何將 REST API 應用於這些業務場景。
使用案例 1:簡化行銷活動建立
Marketo Engage 是一款強大的工具,能助力行銷營運的擴展,其內建的範本和語彙基元功能有助於簡化流程。但咱們得實事求是——其中仍涉及大量手動操作。如果你從事行銷營運工作,可能會花費大量時間複製方案、更新語彙基元以及啟用 Smart Campaign。
如果您每週只管理幾個行銷活動,或許還能應付得來。但要是您同時處理幾十個,甚至上百個行銷活動,全靠手動操作就完全不切實際了。出錯在所難免,而且要確保各行銷活動之間的一致性也成了真正的難題。這時,Marketo Engage REST API 就派上用場了。透過自動化這些重複性任務,您可以節省時間、減少錯誤,並保持所有行銷活動的一致性。
利用 REST API,您可以快速原地複製整個方案,同時保持一切井然有序、統一規範。即便經驗最豐富的 Marketo Engage 使用者也可能犯錯,而自動化能最大限度地降低風險,並幫助維護數據完整性。
這一流程依然允許您根據行銷需求對行銷活動進行個人化定制。REST API 可讓您修改語彙基元等關鍵元素,同時保持行銷活動結構的一致性。
請觀看下面的演示影片,我在影片中會說明如何使用提供的範例程式碼,並根據您所在組織的需求進行調整。
您可以在「範例程式碼」部分找到影片中演示的程式碼,供您離線使用。
使用案例 2:回復不想要的數據變更
設想一下這樣的場景:您手頭的工作已經堆積如山,這時行銷人員又緊急要求您將一份銷售機會清單上傳到 Marketo Engage。您迅速完成了任務,卻聽到 SDR 抱怨數據全錯了!職稱不對,舊的銷售機會被覆蓋,一切亂成一團。
這對任何行銷營運專業人士來說都是噩夢般的場景。手動修復這些錯誤可能需要數小時,甚至數天。但別擔心,Marketo Engage 的 REST API 有解決方案——它就像是數據的時光機,可讓您輕鬆追蹤並回復不想要的數據變更。
透過使用 REST API,您可以拉取近期數據值變更的記錄,識別出不正確的更新,並在幾個簡單步驟內恢復原始資訊。與其手忙腳亂地手動清理數據亂局,不如自動化回退流程,確保數據庫保持準確可靠。
在下面的影片中,我們將探討如何使用 REST API 來逆轉糟糕的數據匯入,保持 Marketo Engage 實例乾淨且無誤。
您可以在「範例程式碼」部分找到影片中演示的程式碼,供您離線使用。
使用案例 3:將深入分析轉化為銷售行動
對於銷售團隊而言,情境就是一切——尤其是在理解一個潛在客戶為何成為行銷合格線索 (MQL) 時。然而,往往那些判定為 MQL 背後的數據都深埋在層層參與量度之中,讓銷售代表們得花費大量時間自行拼湊出某人的情況。
這時,自動化就能派上用場,解決這一難題。透過將 Marketo Engage 與 AI 整合,您可以將參與度數據轉化為清晰、可操作洞察,幫助銷售團隊專注於真正重要的事務——促成交易。
利用 Marketo Engage REST API,您可以拉取近期的參與活動,透過生成式 AI 進行處理,生成簡潔的摘要,並將該摘要推送回 Marketo Engage 以便查看。這意味著銷售代表們無須再篩選某人的活動記錄來了解一個銷售機會是如何成為 MQL 的。相反,他們會得到一份由 AI 產生的簡單說明,闡述該銷售機會的轉化歷程。摘要中會包含該銷售機會對哪些產品或服務表現出興趣,以及他們與你品牌之間的任何關鍵行動。
透過在 Salesforce 中讓銷售團隊即時獲取這些資訊,他們就能更有信心地展開對話,個人化地拓展業務,並最終更快地促成更多交易。
此使用案例旨在於銷售機會轉化為 MQL 時運用 REST API。因此,它每次僅針對一個銷售機會運行。若您正考慮將此方法應用於更大批量的潛在客戶,那麼大量 API 會是更合適的選擇。
讓我們一同觀看下面的影片,了解此設定在實際操作中的運作方式。
您可以在「範例程式碼」部分找到影片中演示的程式碼,供您離線使用。
關鍵重點
以上就是如何利用 Marketo Engage REST API 來簡化行銷營運任務的介紹。
我討論了您可以運用 REST API 的三個強大使用案例:
- 自動化活動複製,以減少手動操作並確保一致性。
- 追蹤並回復不想要的數據變更,以節省數小時的清理時間。
- 為銷售團隊提供即時的 MQL 洞察,以促成更有效的後續對話。
這些自動化技術不僅能節省時間,還能幫助確保準確性、維護數據完整性,並讓行銷和銷售團隊更智慧地工作。
看到 REST API 有如此多的可能性,您可能會覺得有些不知所措,因此我為您提供幾個小建議:
- 從小處著手。 先嘗試一些簡單的事情。建立您的第一個 API 呼叫,並獲取結果。這第一次的呼叫會讓您對所有您能做的事情感到興奮不已。想像一下自己正在建立第一個程式!
- 學習如何編碼,不要害怕它! 編碼其實比看上去要簡單得多。很多時候,它就像是用一種奇怪的英文在寫作。我更偏好使用 Python,您可以在網上找到很多很棒的 Python 課程來報名學習。
- 與社群建立連絡。 有很多 Marketo Engage API 的專家在分享他們的知識。很多時候,您甚至可以在網上找到他們完整的程式碼。
如果你覺得這篇文章很有用,一定要去 Adobe Experience League 看看,那裡有更多同行的洞察和最佳做法。感謝您的閱讀,祝您自動化之路順利愉快!
範例程式碼
簡化行銷活動的建立
import requests
import pandas as pd
import json
import urllib.parse
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
def get_access_token():
global client_id
global client_secret
global MUNCHKIN
params={'grant_type': 'client_credentials', 'client_id': client_id, 'client_secret': client_secret}
headers={'Accept-Encoding': 'gzip'}
url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token"
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
return data['access_token']
templateID=5200
folderName="Active Webinars"
programName="WB-2025-02-20-Test"
eventName="Webinar Test"
eventDate="2025-02-20"
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/byName.json"
token=get_access_token()
params={"name": folderName,
"type": "Folder",
"Content-Type": "application/x-www-form-urlencoded"}
headers={'Authorization': 'Bearer ' + token}
response=requests.get(url=url,params=params, headers=headers)
data=response.json()
print(data)
folderID=data['result'][0]["id"]
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/program/
↪"+str(templateID)+"/clone.json"
token=get_access_token()
params={"Content-Type": "application/x-www-form-urlencoded"}
headers={'Authorization': 'Bearer ' + token}
body="name="+programName+"&folder={'id':"+str(folderID)+",'type':'Folder'}" url=url+"?"+body
response=requests.post(url=url,params=params,headers=headers)
data=response.json()
print(data)
programid=data['result'][0]['id']
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/smartCampaigns.json"
token=get_access_token()
params={"Content-Type": "application/x-www-form-urlencoded"}
headers={'Authorization': 'Bearer ' + token}
body="folder={'id':"+str(programid)+",'type':'Program'}"
url=url+"?"+body
response=requests.get(url=url, params=params, headers=headers)
data=response.json()
campaigns=[]
for campaign in data['result']:
campaigns.append(campaign['id'])
print(campaigns)
for campaign in campaigns:
url="https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/smartCampaign/
↪"+str(campaign)+"/activate.json"
token=get_access_token()
headers={'Authorization': 'Bearer ' + token}
response=requests.post(url=url,headers=headers)
data=response.json()
print(data)
url = "https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/
↪"+str(programid)+"/tokens.json"
token=get_access_token()
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/x-www-form-urlencoded"}
payload = {
"name": "Webinar Name",
"value": eventName,
"type": "text",
"folderType": "Program"}
response = requests.post(url, headers=headers, data=payload)
data=response.json()
data
url = "https://"+MUNCHKIN+".mktorest.com/rest/asset/v1/folder/
↪"+str(programid)+"/tokens.json"
token=get_access_token()
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/x-www-form-urlencoded"}
payload = {
"name": "Webinar Date",
"value": eventDate,
"type": "date",
"folderType": "Program"}
response = requests.post(url, headers=headers, data=payload)
data=response.json()
data
回復不想要的數據變更
import pandas as pd
import csv
import json
import ast
import requests
import math
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
def get_access_token():
global client_id
global client_secret
global MUNCHKIN
params={'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret}
headers={'Accept-Encoding': 'gzip'}
url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token" response=requests.get(url=url,params=params,headers=headers)
data=response.json()
return data['access_token']
sinceDate="2025-04-22T00:00:00-00:00"
field='Job Title'
fieldRest='Title'
listID=299
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities/pagingtoken.json"
token=get_access_token()
params={'sinceDatetime':sinceDate}
headers={'Authorization': 'Bearer ' + token,}
response=requests.get(url=url,params=params, headers=headers)
data=response.json()
nextPageToken=data['nextPageToken']
data
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities.json"
params={'nextPageToken': nextPageToken,
'activityTypeIds':[13],
'listId': listID}
headers={'Authorization': 'Bearer ' + token,}
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
print(data) act=data['result']
while data['moreResult']==True:
nextPageToken=data['nextPageToken']
token=get_access_token()
params={'nextPageToken': nextPageToken,
'activityTypeIds':[13],
'listId': listID}
headers={'Authorization': 'Bearer ' + token}
response=requests.get(url=url,params=params,headers=headers) data=response.json()
print(data)
act=act+(data['result'])
df=pd.json_normalize(act)
df=df[df['primaryAttributeValue']==field]
df=df.sort_values('activityDate')
df=df.reset_index()
df=df.drop(columns=['index'])
df
df1=pd.json_normalize(df['attributes'])
i=4
while i<len(df1.columns):
df1=df1.drop(columns=[list(df1.columns)[i]])
i=i+1
df1.columns=['New_Value','Old_Value','Reason','Source']
df1.New_Value=pd.json_normalize(df1.New_Value)['value']
df1.Old_Value=pd.json_normalize(df1.Old_Value)['value']
df1.Reason=pd.json_normalize(df1.Reason)['value']
df1.Source=pd.json_normalize(df1.Source)['value']
df=pd.merge(df,df1,left_index=True, right_index=True)
df=df.drop(columns=['attributes'])
df=df.drop_duplicates(subset='leadId', keep="first")
df
df.to_excel("dataToCorrect.xlsx")
ids=df[df.columns.to_list()[2]].to_list()
camposval=df['Old_Value'].to_list()
for i in range(len(camposval)):
if camposval[i] == None:
camposval[i] = 'NULL'
STEP=300
a=math.ceil(len(ids)/STEP)
i=0
while i<a:
tempids=ids[i*STEP:(i+1)*STEP]
tempcamposval=camposval[i*STEP:(i+1)*STEP]
params={'action': 'updateOnly',
'lookupField': 'id',
'input':[]}
j=0
while j<len(tempids):
lead={'id':tempids[j],
fieldRest:tempcamposval[j]}
params['input'].append(lead)
j=j+1
token=get_access_token()
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/leads.json"
headers={'content-type': 'application/json', 'Authorization': 'Bearer ' + token }
i=i+1
response=requests.post(url=url,data=json.dumps(params), headers=headers)
print(response.json()['result'])
將洞察轉化為銷售行動
importrequests
import pandas as pd
import json
fromdatetimeimportdatetime, timedelta
MUNCHKIN = "YOUR-MUNCHKIN-ID"
client_id = "YOUR-CLIENT-ID"
client_secret= "YOUR-CLIENT-SECRET"
defget_access_token():
globalclient_id
globalclient_secret
globalMUNCHKIN
params={'grant_type': 'client_credentials',
'client_id': client_id,
'client_secret': client_secret}
headers={'Accept-Encoding': 'gzip'}
url="https://"+MUNCHKIN+".mktorest.com/identity/oauth/token"
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
return data['access_token']
leadid="1007244"
ndays=60
gptAPIKey="Bearer␣
↪sk-proj-ne6OZggjgQhQU6XcG0ocHNPNzBvOOULTkk8a-75Y75rHKS-vyztxPYq0OLaFsnhtGivx9bVUNoT3BlbkFJH
fieldName="MktoPersonNotes"
today = datetime.today()
sinceDate = today - timedelta(days=ndays)
sinceDate = sinceDate.strftime("%Y-%m-%dT00:00:00")
url="https://"+MUNCHKIN+".mktorest.com/rest/v1/activities/pagingtoken.json"
token=get_access_token()
params={'sinceDatetime': sinceDate}
headers={'Authorization': 'Bearer ' + token}
response=requests.get(url=url,params=params,headers=headers)
data=response.json()
nextPageToken=data['nextPageToken']
data
access_token=get_access_token()
def get_lead_activities(token, lead_id, firstToken):
url = f"https://"+MUNCHKIN+".mktorest.com/rest/v1/activities.json"
params={
"leadId": lead_id,
"activityTypeIds": "1,2,3,10,11,34,104",
"nextPageToken": firstToken
}
headers={'Authorization': 'Bearer ' + token}
activities = []
more_results = True
while more_results:
response = requests.get(url, params=params, headers=headers)
data = response.json()
if 'result' in data:
activities.extend(data['result'])
more_results = data.get('moreResult', False)
if more_results:
params["nextPageToken"] = data['nextPageToken']
return activities
all_activities = get_lead_activities(access_token, leadid,nextPageToken)
all_activities = str(all_activities).replace('"', "'")
activities=all_activities
activities
def send_to_chatgpt(activities):
url = "https://api.openai.com/v1/chat/completions"
headers = {
"Authorization": gptAPIKey,
"Content-Type": "application/json"
}
prompt = """Analyze the following lead activities and explain the␣
↪activities that contributed to this lead being marked as MQL so a␣
↪salesperson knows how they should approach the client, including which␣
↪product or service this lead is most interested in and any other relevant␣
↪insights. Include relevant URLs on form fills:""" +activities+""" – Remember␣
↪this will only be read by a salesperson, so don't use technical␣
↪explanations, just your best summary. Keep your response limited to 100␣
↪words."""
data = {
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 250
}
response = requests.post(url, headers=headers, json=data)
return response.json()
gpt_response = send_to_chatgpt(activities)['choices'][0]['message']['content']
gpt_response
def update_marketo_field(lead_id, field_name, gpt_response):
access_token=get_access_token()
url = "https://"+MUNCHKIN+".mktorest.com/rest/v1/leads.json"
headers = {
"Content-Type": "application/json",
'Authorization': 'Bearer ' + token
}
payload = {
"action": "updateOnly",
"lookupField": "id",
"input":[
{
"id": int(lead_id),
field_name: gpt_response
}
]
}
response = requests.post(url, headers=headers, json=payload)
return response.json()
update_response = update_marketo_field(leadid, fieldName, gpt_response)
update_response