Skip to main content

Automate

Connect Launch529 to the tools you already use, without writing code.

Send events to Zapier, Make, Slack, Discord or Teams. Keep a live spreadsheet of your expenses. Put 529 deadlines on your calendar. Everything is set up in the Apps page, and everything below is free to use on a Launch529 account.

Recipes

Start with one of these.

Every new expense becomes a row in Google Sheets

  1. In Zapier, make a Zap. Trigger: Webhooks by Zapier, “Catch Hook”. Copy the address it gives you.
  2. In Launch529, open Apps, then Zapier, Slack and webhooks, and add that address. Choose the event “expense.created”. Press Send test.
  3. Back in Zapier, add the action Google Sheets, “Create Spreadsheet Row”. Map data.date, data.vendor, data.amount_usd, data.category and data.student to your columns.

Approvals in a Slack channel

  1. In Slack, make an incoming webhook for the channel (Slack’s own “Incoming Webhooks” app).
  2. Paste its address into Launch529 under Apps. We detect Slack and post short messages like “Approved: Campus Bookstore, $84.50, for Oliver”.
  3. It starts with expense alerts only. Tick other events to add them.

A live spreadsheet for your accountant

  1. In Launch529 open Apps, then Spreadsheet, and turn it on.
  2. Paste the =IMPORTDATA formula into any cell of a Google Sheet. It refreshes about every hour. Share the sheet, not the link.
  3. In Excel, use Data, Get Data, From Web with the link instead.

Deadlines on your phone

  1. Open Apps, then Calendar, and choose Add to my calendar.
  2. You get the year-end deadline for taking money out of the 529, when each student starts and finishes school, and receipt reminders. Add your own dates, like tuition due dates. No amounts are ever in it.

Make things happen from another tool

  1. Make an API key in Launch529 under Connect, then AI. Choose read and make changes.
  2. In Zapier use “Webhooks by Zapier”, “POST”, to https://launch529.com/api/v1/tools/log_expense with the header Authorization: Bearer YOUR_KEY and a JSON body with the expense.
  3. Every action Launch529’s assistant can do is available this way. The full list is in the OpenAPI file.

Webhooks

What we send, and how to trust it.

Add an https address under Apps and choose which events you want, or leave them all on. Each event is one JSON POST. We never send receipt images, card numbers or account numbers, only what you would see in the expense list.

Events

  • expense.createdAn expense is added, by hand, from a receipt, by email or text, or by an AI
  • expense.approvedA parent approves an expense
  • expense.sent_backA parent sends an expense back for changes
  • expense.rejectedA parent rejects an expense
  • receipt.attachedA receipt is attached to an expense
  • expenses.importedA spreadsheet of expenses is imported
  • student.addedA student is added
  • school.addedA school is added to a student’s path
  • plan.addedA 529 plan is added
  • person.invitedSomeone is invited to the account
  • reimbursement.requestedA reimbursement request is made

An example

{
  "id": "6f1c0b7e-3c1a-4a52-9f0e-2b7d2f6a9c11",
  "type": "expense.created",
  "created_at": "2026-09-03T14:21:08.000Z",
  "data": {
    "expense_id": "d9b1…",
    "vendor": "Campus Bookstore",
    "description": "Organic Chemistry textbook",
    "amount_usd": 84.5,
    "date": "2026-09-03",
    "category": "Books and Supplies",
    "qualified": true,
    "status": "pending_review",
    "has_receipt": true,
    "student": "Oliver",
    "link": "https://launch529.com/expenses/d9b1…",
    "source": "email"
  }
}

Delivery

  • Answer with any 2xx within 8 seconds.
  • If you don’t, we try again after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours, then stop. A webhook that keeps failing for a week is switched off, and we say so on the Apps page.
  • Retries send the same event id, so use it to ignore repeats.
  • Addresses must be https and on the public internet. Press Send test on the Apps page to try yours.

Headers

  • Launch529-Event: the event name.
  • Launch529-Delivery: this delivery’s id.
  • Launch529-Timestamp: seconds since 1970.
  • Launch529-Signature: v1= and a hex HMAC-SHA256 of timestamp.body, signed with your webhook’s secret.

Zapier and Make don’t need the signature. It’s for your own receiver, to be sure a request really came from Launch529. The secret is shown once, when you add the webhook.

Check the signature

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(secret, headers, rawBody) {
  const ts = headers["launch529-timestamp"];
  const expected = "v1=" + createHmac("sha256", secret).update(ts + "." + rawBody).digest("hex");
  const given = headers["launch529-signature"];
  const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
  return fresh && expected.length === given.length && timingSafeEqual(Buffer.from(expected), Buffer.from(given));
}
import hashlib, hmac, time

def verify(secret: str, headers: dict, raw_body: bytes) -> bool:
    ts = headers["Launch529-Timestamp"]
    expected = "v1=" + hmac.new(secret.encode(), ts.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
    fresh = abs(time.time() - int(ts)) < 300
    return fresh and hmac.compare_digest(expected, headers["Launch529-Signature"])

Slack, Discord and Teams

Plain sentences, in the right shape.

Paste a channel’s incoming-webhook address and we recognise Slack, Discord and Microsoft Teams. Instead of raw data you get a short message with a link, such as “New expense to review: Campus Bookstore, $84.50, Books and Supplies, for Oliver”. A chat channel starts with expense alerts and reimbursement requests. Choose other events to change that.

Want to build more?

Launch529 also has an API, an MCP server and a command line for your own account, and open tools anyone can use for college costs and 529 plans. See how to connect an AI.

Less typing, fewer missed receipts. Connect your tools.

Set up an integration in a minute from the Apps page. The Planner is free, and Pro adds expense tracking when the bills start.