πŸ“† Twilio λ©”μ‹œμ§€ μ˜ˆμ•½ 전솑 μ™„μ „ 정볡 (SMS/WhatsApp Scheduling κ°€μ΄λ“œ)

Nova | 김인후·2025λ…„ 5μ›” 10일
post-thumbnail

πŸ“˜ λ³Έ λ¬Έμ„œλŠ” Twilio 곡식 λ¬Έμ„œμΈ Message Schedulingλ₯Ό ν•œκ΅­μ–΄λ‘œ λ²ˆμ—­/μ •λ¦¬ν•œ κΈ€μž…λ‹ˆλ‹€.
μ΅œμ‹  정보 및 μžμ„Έν•œ κΈ°λŠ₯은 λ°˜λ“œμ‹œ 곡식 λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.


Twilio의 Message Scheduling κΈ°λŠ₯은 미래의 νŠΉμ • μ‹œμ μ— SMS, MMS, WhatsApp λ©”μ‹œμ§€λ₯Ό μ˜ˆμ•½ 전솑할 수 μžˆλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€. 이 κΈ°λŠ₯은 Messaging Serviceλ₯Ό ν†΅ν•΄μ„œλ§Œ μ‚¬μš©ν•  수 있으며, Engagement Suite에 ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.


βœ… 사전 쑰건

  • 이미 λ©”μ‹œμ§€λ₯Ό 일반적으둜 Twilio Messaging Serviceλ₯Ό 톡해 전솑할 수 μžˆμ–΄μ•Ό 함
  • WhatsApp λ©”μ‹œμ§€λ₯Ό μ˜ˆμ•½ν•˜λ €λ©΄ WhatsApp λ°œμ‹  λ²ˆν˜Έκ°€ Messaging Service의 Sender Pool에 λ“±λ‘λ˜μ–΄ μžˆμ–΄μ•Ό ν•˜λ©°, 사전 승인된 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•΄μ•Ό 함

βœ‰οΈ λ©”μ‹œμ§€ μ˜ˆμ•½ 전솑 방식

Twilioμ—μ„œ μ˜ˆμ•½ λ©”μ‹œμ§€λ₯Ό 생성할 땐, 일반 λ©”μ‹œμ§€μ™€ λ™μΌν•˜κ²Œ Message λ¦¬μ†ŒμŠ€λ₯Ό μƒμ„±ν•˜λ˜,
두 κ°€μ§€ μΆ”κ°€ νŒŒλΌλ―Έν„°λ₯Ό 포함해야 ν•©λ‹ˆλ‹€:

νŒŒλΌλ―Έν„°ν•„μˆ˜ κ°’μ„€λͺ…
scheduleTypefixedμ˜ˆμ•½ 전솑을 μ˜λ―Έν•˜λŠ” κ³ μ •κ°’
sendAtISO 8601 ν˜•μ‹μ˜ λ‚ μ§œ (2025-06-10T15:00:00Z)λ©”μ‹œμ§€λ₯Ό 전솑할 μ‹œμ 

κ·Έ 외에도 μ•„λž˜ 값듀이 ν•„μš”ν•©λ‹ˆλ‹€:

  • messagingServiceSid: λ©”μ‹œμ§€λ₯Ό 전솑할 Messaging Service의 SID
  • body λ˜λŠ” mediaUrl λ˜λŠ” contentSid
  • to: μˆ˜μ‹ μž 번호 (예: +821012345678) λ˜λŠ” WhatsApp μ£Όμ†Œ (예: whatsapp:+821012345678)

πŸ”’ μ œν•œμ‚¬ν•­

  • λ©”μ‹œμ§€λŠ” 전솑 5λΆ„ μ „κΉŒμ§€λŠ” μ˜ˆμ•½λ˜μ–΄μ•Ό 함
  • μ˜ˆμ•½μ€ μ΅œλŒ€ 35일 ν›„κΉŒμ§€ κ°€λŠ₯함

πŸ’» 예제 μ½”λ“œ (Node.js)

const twilio = require("twilio");
const accountSid = process.env.TWILIO_ACCOUNT_SID;
const authToken = process.env.TWILIO_AUTH_TOKEN;
const client = twilio(accountSid, authToken);

async function createMessage() {
  const message = await client.messages.create({
    body: "이건 μ˜ˆμ•½λœ λ©”μ‹œμ§€μž…λ‹ˆλ‹€.",
    messagingServiceSid: "MGXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    scheduleType: "fixed",
    sendAt: new Date("2025-06-10T15:00:00Z"),
    to: "+821012345678",
  });
  console.log(message.sid);
}

createMessage();

πŸ“© Twilio 응닡 μ˜ˆμ‹œ

{
  "status": "scheduled",
  "sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "to": "+821012345678",
  "messaging_service_sid": "MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
  • λ©”μ‹œμ§€κ°€ 정상 μ˜ˆμ•½λ˜λ©΄ HTTP 응닡 μ½”λ“œ 201κ³Ό ν•¨κ»˜ status: scheduled둜 ν‘œμ‹œλ¨
  • λ©”μ‹œμ§€κ°€ μ‹€νŒ¨ν•˜λ©΄ 400 였λ₯˜ λ°œμƒ (μ‹œκ°„ ν˜•μ‹ 였λ₯˜ λ“±)

⚠️ 전솑 μ‹œ μ‹€νŒ¨ν•  수 μžˆλŠ” 경우

1. μˆ˜μ‹ μžκ°€ Opt-Out ν•œ 경우

μ˜ˆμ•½ λ‹Ήμ‹œμ—λŠ” μƒμ„±λ˜μ§€λ§Œ, 전솑 μ‹œμ μ— ν•΄λ‹Ή μ‚¬μš©μžκ°€ 차단(Opt-Out)ν–ˆμ„ 경우 λ©”μ‹œμ§€λŠ” μ‹€νŒ¨ 처리됨 (21610)

β†’ λ©”μ‹œμ§€ μ·¨μ†Œ APIλ₯Ό μ‚¬μš©ν•΄ 사전에 μ·¨μ†Œ κ°€λŠ₯

2. WhatsApp ν…œν”Œλ¦Ώ μœ νš¨μ„± μ‹€νŒ¨

ν…œν”Œλ¦Ώμ€ λ©”μ‹œμ§€ 생성 μ‹œκ°€ μ•„λ‹Œ, μ‹€μ œ 전솑 μ‹œμ μ— μœ νš¨μ„± 검사λ₯Ό κ±°μΉ¨.
ν—ˆμš©λ˜μ§€ μ•Šμ€ ν…œν”Œλ¦Ώμ΄λ©΄ 전솑 μ‹€νŒ¨


πŸ›‘ μ˜ˆμ•½ λ©”μ‹œμ§€ μ·¨μ†Œ

async function cancelMessage() {
  const message = await client
    .messages("SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
    .update({ status: "canceled" });
  console.log(message.status); // canceled
}
  • status: "canceled" 둜 μ—…λ°μ΄νŠΈν•˜λ©΄ μ˜ˆμ•½μ΄ μ·¨μ†Œλ¨
  • μ΄λ•Œ status callbackμ—λŠ” canceled μ΄λ²€νŠΈκ°€ 전솑됨

πŸ’‘ μœ μ˜μ‚¬ν•­

  • ν•˜λ‚˜μ˜ Twilio 계정(μ„œλΈŒκ³„μ • 포함) λ‹Ή μ΅œλŒ€ 1,000,000개의 μ˜ˆμ•½ λ©”μ‹œμ§€ 생성 κ°€λŠ₯
  • μ˜ˆμ•½ λ©”μ‹œμ§€λŠ” μ˜ˆμ•½λœ μˆœκ°„λΆ€ν„° 카운트됨

🏷️ κ΄€λ ¨ λ¬Έμ„œ

0개의 λŒ“κΈ€