Skip to main content

Email Deliverability

Glancito automatically protects your sender reputation by tracking marketing consent, handling email bounces, and processing unsubscribe requests — so your campaigns only reach customers who want to hear from you.


What It Is

When a customer opts in to email or SMS marketing (at checkout or through Shopify), Glancito records that preference. Every campaign respects this: members who have not consented to email marketing are silently skipped when a campaign is dispatched.

Where You See It

Members list — two badges appear per member:

┌──────────────────────────────────────────────────────────┐
│ Name │ Email │ Points │ Consent │ ...│
├──────────────────────────────────────────────────────────┤
│ Sarah J. │ s@... │ 1,250 │ Email ✓ SMS ✓ │ │
│ Mike C. │ m@... │ 450 │ Email ✗ │ │
│ Emma W. │ e@... │ 105 │ Unsubscribed │ │
└──────────────────────────────────────────────────────────┘
  • Email ✓ (green) — consented to email marketing
  • Email ✗ (yellow) — not consented; campaigns skip this member
  • SMS ✓ (green) — consented to SMS marketing
  • Unsubscribed (red) — member clicked "Unsubscribe"; all marketing suppressed

Filter in Members list — use the "Marketing consent" filter dropdown:

Filter optionShows
AllEveryone
Email consentedemail_marketing_consent = true
Email not consentedemail_marketing_consent = false
SMS consentedsms_marketing_consent = true

Segment builder — add "Email Marketing Consent" or "SMS Marketing Consent" as a rule when creating a segment, so you can build an audience of opted-in members only.

Consent is synced from Shopify when:

  • A customer checks "Accept email marketing" at checkout
  • A customer subscribes via Shopify storefront
  • A Shopify customers/update webhook fires and the email_marketing_consent or sms_marketing_consent field changes

Glancito does not override consent — Shopify is the source of truth.


Bounce Handling

Hard Bounce vs. Soft Bounce

TypeMeaningGlancito action
Hard bouncePermanent failure — invalid address, domain does not existBlock all future sends immediately
Soft bounceTemporary failure — mailbox full, server temporarily downRecord the bounce; do not block sends

How Bounces Are Detected

AWS SES sends bounce and complaint notifications to Glancito via an SNS topic. The POST /api/v1/sns-bounce endpoint processes these notifications and updates the member record.

SES send attempt
→ Recipient mail server rejects / accepts
→ SES publishes bounce notification to SNS topic
→ SNS POSTs to /api/v1/sns-bounce
→ Verify SNS signature
→ Match email → Member
→ Set email_bounce_type = "hard" | "soft"
→ Set email_bounce_at = now()
→ If complaint → set email_complaint_at = now()

Where You See It

A Bounce column appears in the Members list:

│ Bounce │
├─────────────────┤
│ Hard bounce │ ← red badge, no further sends
│ Soft bounce │ ← yellow badge, still eligible
│ — │ ← no bounce recorded

Opening a member profile shows the full bounce history.

What Gets Blocked

Before every email send, Glancito checks:

  1. Is the member's email_bounce_type equal to "hard"? → Skip
  2. Is email_marketing_consent false? → Skip
  3. Is email_unsubscribed true? → Skip

Campaign dispatch also filters these members out at query time, so they never enter the send queue at all.


Every Email Has One

Glancito automatically appends an unsubscribe footer to every campaign email:

<div style="text-align:center; padding:16px; font-size:12px; color:#888;">
<a href="https://app.glancito.com/api/v1/unsubscribe/{token}">Unsubscribe</a>
</div>

The link is unique per member. It is signed with an HMAC-SHA256 token so it cannot be guessed or forged.

What Happens When a Member Clicks Unsubscribe

Member clicks unsubscribe link
→ GET /api/v1/unsubscribe/{token}
→ Verify HMAC token
→ Set member.email_unsubscribed = true
→ Call Shopify Admin API to update customer:
email_marketing_consent.state = "unsubscribed"
sms_marketing_consent.state = "unsubscribed"
→ Return confirmation page

The member is immediately suppressed in Glancito and the unsubscribe is synced back to Shopify so no other tool (Klaviyo, Mailchimp, etc.) can send to them either.

Viewing Unsubscribes

In the Members list, filter by "Email not consented" to see suppressed members. Unsubscribed members show a red Unsubscribed badge in the Consent column.


Email Sending Pipeline

When a campaign is dispatched, each email goes through this pipeline before hitting SES:

1. Marketing consent check (skip if not consented)
2. Unsubscribe check (skip if unsubscribed)
3. Hard bounce check (skip if hard-bounced)
4. Placeholder substitution ({{first_name}}, {{points}}, {{shop_name}})
5. UTM parameter injection (?utm_source=glancito&utm_campaign={id})
6. Click-tracking rewrite (wrap links with /api/v1/track/click)
7. Open-tracking pixel (1×1 img before </body>)
8. Unsubscribe footer injection (before </body>)
9. SES send (via boto3)

Best Practices

Keep Your List Clean

  • Review "Hard bounce" members monthly and investigate whether the email address was entered incorrectly
  • Do not import addresses that have never opted in — this raises complaint rates
  • An unsubscribe rate above 0.5% per campaign is a signal the content or frequency needs adjustment

Warm Up a New Sending Domain

If you use a custom merchant sending domain (Settings → Email → Custom Domain):

  1. Start with small segments (fewer than 500 members)
  2. Increase volume gradually over 2–4 weeks
  3. Monitor bounce and complaint rates in the Campaign Analytics panel

Complaint Rate

AWS SES will pause your sending if your complaint rate stays above 0.1%. Glancito logs complaints via the same SNS webhook and can surface members who have marked your email as spam — contact support if you see a spike.


Common Questions

Q: A member says they didn't get my campaign email. What do I check?

  1. Open their member profile
  2. Check the Consent column — are they email-consented?
  3. Check the Bounce column — do they have a hard bounce?
  4. Check email_unsubscribed — did they unsubscribe?
  5. If all clear, they may be in the segment but their email provider filtered it to spam

Q: Can I re-enable sending to a hard-bounced address?

A: Only if you have confirmed the address is valid (e.g., the customer contacted you directly). Edit the member profile and clear the bounce status manually. Be cautious — sending to invalid addresses again will re-trigger the bounce and hurt your sender score.

Q: Does unsubscribing from a campaign email unsubscribe from transactional emails (points earned, tier upgrade)?

A: No. The unsubscribe link only suppresses marketing emails (campaigns). Transactional notifications are controlled separately in Settings → Notifications.