Loopi
PricingPlaybooks

Playbook · Mail

Pipe product signups into a Loopi list from your own backend.

You shipped a product. Every new signup should land somewhere that can email them — a feedback request a week later, a heads-up whenever you ship something. One fetch call in your signup handler wires every user into a Loopi list; your AI agent writes and schedules the emails. No mail platform to learn, no dashboard to babysit.

You can hand this page to your AI agent. Paste the URL — https://loopi.social/playbooks/webhook-signups — into Claude Code with Loopi connected and say "Read this Loopi playbook and set up the list, feedback sequence, and the signup snippet for me." The agent builds the Loopi side; you drop the one fetch call into your handler.

What it does for you

One integration, three payoffs — all driven from a single list every signup flows into:

  1. Every new user is added to your list automatically, from your own backend.
  2. A feedback email goes out 7 days after signup — written and scheduled by your agent, no cron to run.
  3. Whenever you ship a feature, one prompt broadcasts it to everyone who signed up.

User signs up on your site

Your existing signup flow

→

Auth: API key

Your backend → Loopi

POST /events · 1 fetch call

→

Subscriber on your list

Stored in Loopi

Auto-drip↓
You broadcast↓

Automatic

Sequence fires at +7 days

Auto feedback email

You trigger

Broadcasts whenever you ship

Feature announcements to the whole list

One fetch call wires every signup into a list. From there: a feedback sequence at +7 days, and broadcasts whenever you ship a feature.
Is it worth the effort? The whole integration is one fetch call in code you already have, plus one prompt to build the list and sequence. In return, every user you've ever signed up becomes a feedback data point and a launch-day audience — automatically, with no mailing platform to learn.

What the API key can and can't do

Your profile API key powers two things. Over MCP it gives your AI agent full access to your Loopi profile. Over the /events webhook it exposes exactly two operations: mail.subscribe and mail.unsubscribe. That is the entire webhook surface. Drafting the feedback email, writing broadcasts, scheduling them, editing the sequence, importing your existing users — all of that happens by connecting Loopi to your AI agent over MCP and asking in plain English. The first-list-and-welcome playbook walks through the MCP setup if you haven't done that yet.

Step 1 — Create the list and the 7-day feedback sequence

Open your agent (Claude Desktop, Claude Code — anything with Loopi MCP connected) and paste this. Fill in <YOUR PRODUCT>. The agent creates the list, drafts the feedback email, previews it to your inbox, and activates the sequence — all in one go.

prompt — create list + feedback sequence
Create a list called "Product signups" and attach a 1-step sequence to it.
Do NOT include a welcome email — only the +7-day feedback step below.

Step 1 — fires 7 days after subscribe.
Subject line: a casual, first-person question — not a marketing line.
Body: I'm a solo dev who just shipped <YOUR PRODUCT>. They signed up a week
ago. Ask three short questions in plain text (no HTML chrome, no header
image — looks like a real email from a person):

  1. Did you actually use it? (yes / no / not yet)
  2. What's the one thing that almost made you bounce?
  3. What would make you tell a friend about it?

End with: "Hit reply — every message comes to my inbox." Sign off with
my first name only.

Draft it, preview to my inbox, and activate the sequence once it looks
right. Then give me the listId — I need to paste it into my signup
handler.

The agent returns a listId like mlst_.... Copy it — you'll paste it into your signup handler in step 3.

Why 7 days, not 1. Day 1 is too early — they haven't used it yet. Day 30 is too late — they've forgotten. Day 7 catches the people who tried it, hit a wall, and have an opinion about it. Tune the delay in the dashboard if your product has a different "moment of truth."

Step 2 — Create your profile API key

Go to /app/api-keys (the API & MCP tab) and create a key. The full key is shown exactly once, at creation — copy it right then. Loopi stores only a hash and can't show it to you again, so if you lose it you mint a new one. You pass the target list's ID in each request body (the listId field), so one key works across all your lists.

Server-side env var only. Name it LOOPI_API_KEY. Never expose it in client code, and never commit it to a public repo.

Step 3 — Add one fetch call to your signup handler

Right after you save the new user to your database (or create their Stripe customer), add this. Swap mlst_REPLACE for the listId from step 1. The tag is a free-text label — you'll use it later to segment broadcasts (e.g. "everyone tagged product_signup who joined in the last 30 days").

Node — Next.js / Express / anywhere

node — fetch
// app/api/signup/route.ts (or wherever your signup handler lives)
await fetch("https://api.loopi.social/events", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.LOOPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    action: "subscribe",
    listId: "mlst_REPLACE",
    email,
    name,
    tag: "product_signup",
  }),
});

Python — Flask / FastAPI / Django

python — requests
# inside your signup view
import os, requests
requests.post(
    "https://api.loopi.social/events",
    headers={"Authorization": f"Bearer {os.environ['LOOPI_API_KEY']}"},
    json={
        "action": "subscribe",
        "listId": "mlst_REPLACE",
        "email": email,
        "name": name,
        "tag": "product_signup",
    },
)

curl — for poking it manually

shell
curl https://api.loopi.social/events \
  -H "Authorization: Bearer $LOOPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "action": "subscribe",
    "listId": "mlst_REPLACE",
    "email": "new@user.com",
    "name": "Ada Lovelace",
    "tag": "product_signup"
  }'

Response shape

Three possible statuses. All three are non-failure — you don't need to surface any of them to your user unless you want to.

  • "ok" — new subscriber on the list. The 7-day feedback timer starts now.
  • "already_subscribed" — they're already on the list (re-signup, multi-session). No duplicate enrollment.
  • "suppressed" — they previously unsubscribed or hard-bounced. Loopi will not re-add them. Surface this to the user if your UX cares.

Once this ships, the feedback loop is live. Sign yourself up with a throwaway email to confirm — you should appear on the list within seconds, and the feedback email lands exactly a week later.

Bonus — broadcast a feature announcement

Same list, different mechanic: a broadcast is a one-off email to everyone on the list, fired the moment you ship something worth telling them about. No code change needed — just ask your agent.

prompt — schedule a feature-announcement broadcast
Send a broadcast to the "Product signups" list.

We just shipped <FEATURE NAME>. Write it like a short Twitter thread, not
a press release — 3-4 short paragraphs, plain text, first person. Lead
with the user pain it removes (not the feature name). One screenshot in
the middle. End with a one-line CTA back to the product. Subject line:
something curious, not "Announcing X" — make them want to open it.

Draft it, send the preview to my inbox, wait for my approval, then
schedule it for 10am tomorrow in America/New_York.

The agent drafts, previews to your inbox, and waits for your green light before scheduling. Two minutes of writing per shipped feature, and the whole signup base hears about it.

Optional — mirror in-app "stop emails" into Loopi

If your product has an in-app preference toggle (or a "delete my account" button), use the same endpoint with action: "unsubscribe" so the user doesn't have to find Loopi's unsubscribe link.

node — unsubscribe
// Same endpoint, different action. Mirror your in-app "delete account"
// or "stop emails" toggle so users don't have to use Loopi's unsubscribe
// link.
await fetch("https://api.loopi.social/events", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.LOOPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    action: "unsubscribe",
    listId: "mlst_REPLACE",
    email,
  }),
});

If you leak the key

Revoke the leaked key on /app/api-keys and create a new one — you'll see the new key once, at creation. Update your LOOPI_API_KEY env var with it and redeploy. The revoked key stops working immediately.

Haven't connected Loopi MCP to your agent yet? Start there →

Wire your signups into a feedback loop tonight.

One prompt creates the list and the sequence. One fetch call in your signup handler ships the rest. Every new user becomes a feedback data point in 7 days and a broadcast recipient forever.

Go to the dashboard →
loopi
PrivacyTermsloopi.social · 2026