ESP: Loops7 min read

Loops drives activation. Seeds protect it.

Loops is the product-email platform for SaaS: welcome, onboarding, feature announcements. If a day-1 welcome lands in Promotions, activation numbers tank silently. Seeds in every sequence keep that from happening.

Loops positions itself as the email platform for SaaS products — transactional, lifecycle and product-update emails in one place, with a clean API and a UI built for PMs and operators. The pitch works because onboarding email is the single highest-leverage surface in a SaaS funnel: a welcome email that lands in Primary triggers activation, one in Promotions does not.

TL;DR

Add 20+ seed addresses as Loops contacts, put them into every onboarding loop via a dedicated is_seed contact property, and read per-provider placement within minutes of each step firing. Day-1 in Spam on Outlook kills activation regardless of how good your product is.

Why onboarding placement dominates activation

Most SaaS products have a 3–7 email onboarding sequence: welcome, first-task nudge, feature discovery, re-engagement, maybe a “are you stuck?” message on day 7. Each email is designed to push a user across an activation threshold. The sequence depends entirely on the user seeing the email. Gmail Promotions ≠ inbox. Outlook Junk ≠ inbox. A sequence that averages 60% inbox placement delivers ~60% of its designed activation lift.

The dangerous part is that Loops's own dashboard looks fine when this happens — delivery rate 99%, complaint rate 0.01%, nothing flags. The email was “delivered” to Gmail. Where Gmail filed it is not Loops's concern, and so nobody looks. Seeds close the loop.

Setting up seed contacts in Loops

Loops uses contacts (users) plus event-driven loops (sequences). The cleanest seeding pattern is: import seeds as normal contacts with a boolean property is_seed, put the seeds through every loop alongside real users, and filter them out of reporting downstream.

  1. Import seed contacts once. In Loops, go to Audience → Add contact. For each seed address, set is_seed: true, firstName: Seed, plus any other properties your loops require (say, plan: free to match the default new-user path).
  2. Use the Loops API to batch it. If you are starting with 20 seeds, a one-time script via the contacts API is faster than the UI.
  3. Trigger seeds through every loop. Most Loops are triggered by events. Fire the same events for seeds that you fire for real users — either via the Loops API or by including seeds in the event stream from your product.
  4. Read placement per step. Each email in the loop hits the seed mailboxes within minutes of the trigger. Your placement-check tool correlates sends to addresses and gives you per-step folder data.
// One-time seed import via Loops contacts API
const SEEDS = process.env.SEED_ADDRESSES!.split(',');

for (const email of SEEDS) {
  await fetch('https://app.loops.so/api/v1/contacts/create', {
    method: 'POST',
    headers: {
      Authorization: `Bearer ${process.env.LOOPS_API_KEY}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      email,
      firstName: 'Seed',
      userGroup: 'seed',
      is_seed: true,           // custom boolean property
      plan: 'free',            // match default new-user path
      source: 'seed-import',
    }),
  });
}

// Triggering the onboarding event for a real user
// (adjust your product event firing to also fire for seeds on a cadence)
await fetch('https://app.loops.so/api/v1/events/send', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LOOPS_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    email: 'real-user@example.com',
    eventName: 'signup',
  }),
});

Placement visibility loop-by-loop

One round of seed testing is not enough for a 7-step onboarding sequence. Each step has its own subject, its own content, its own place in the Gmail classifier's mental model of your domain. Day-1 welcome might land Primary while day-3 feature-nudge lands Promotions. Seeds expose this step by step.

  • Step 1 (welcome) — single-image, short subject, explicit “from” name. Usually Primary. If not, your DKIM/SPF alignment is broken or the domain is brand-new.
  • Step 2 (first-task nudge) — usually Primary if step 1 was. This is the easy case.
  • Step 3–4 (feature discovery) — this is where Promotions drift starts. Multiple CTAs, images, marketing-like structure. Tune subject line and trim imagery if seeds show Promotions here.
  • Step 5+ (re-engagement) — highest risk. Long gap since last open, content often promotional. Seeds will tell you whether the sequence has drifted into a Promotional-shaped pattern Gmail recognises.
Get 20+ seed addresses free

The free Inbox Check tool generates 20+ fresh seed addresses per test across Gmail, Outlook, Yahoo, Mail.ru, Yandex, ProtonMail and more. No signup, no credit card.

→ Run a free test now

Keep seeds out of Loops reporting

Seeds will never open, never click, never convert. If they are counted in your onboarding metrics, each seed drags open and click rate down by one per N contacts. Loops has two clean ways to filter them:

  1. UserGroup filter. Put all seeds into a userGroup: "seed" and exclude that group in analytics dashboards. Loops's report builder respects userGroup filters.
  2. Custom boolean property. The is_seed: true property travels on the contact. Any downstream data export or warehouse sync can filter on it.

But do not exclude seeds from sends

The whole point is that seeds receive the same emails as real users, right when real users receive them, through the same delivery pipeline. Exclude seeds from reporting; never exclude them from sending. If you exclude them from loops, you lose the placement signal.

Common mistakes with Loops seeding

  • Seeding only the welcome. Onboarding is a sequence. Every step can independently drift into Promotions. Seed all steps or none.
  • Using fake data for seed contacts. Seeds need to match the real user path. If your loops branch on plan or signupSource, set those properties on seeds to match a realistic new-user shape.
  • Seeding your own company mailbox only. Your own domain's mailbox has special whitelist treatment. It will almost always show Primary. That tells you nothing about how Gmail files your mail in stranger accounts.
  • Ignoring Outlook. B2B SaaS onboarding skews heavily Outlook. A seed set that only covers Gmail and Yahoo misses half your audience. Ensure your seed pool has 5+ Outlook addresses.

Frequently asked questions

Does Loops count seed contacts against my Loops contact quota?

Yes. Each seed is a contact and counts against plan limits. 20 seeds on a Plus plan is a rounding error; on a Starter plan check the contact ceiling. You can also seed only the most critical loops rather than all contacts.

Will seeds trigger revenue events or billing events I fire on activation?

Only if you fire those events for seed contacts. Keep a seed-aware guard in your event-emitting code: if (user.is_seed) return; before firing revenue-impacting events to avoid dashboard noise.

Can I seed Loops transactional emails sent via the /transactional API?

Yes. The /transactional endpoint accepts a regular email address. Call it for each seed address in parallel to the real send, or wrap your transactional helper to dispatch to both sequentially.

How often should I check seed placement during onboarding sequence tuning?

Every time you change a subject line, image, or CTA structure on any onboarding step. Placement changes are a leading indicator; by the time A/B test data comes in, you have burned through thousands of real users.
Related reading

Check your deliverability across 20+ providers

Gmail, Outlook, Yahoo, Mail.ru, Yandex, GMX, ProtonMail and more. Real inbox screenshots, SPF/DKIM/DMARC, spam engine verdicts. Free, no signup.

Run Free Test →

Unlimited tests · 20+ seed mailboxes · Live results · No account required