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.
Marketing Consent
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 option | Shows |
|---|---|
| All | Everyone |
| Email consented | email_marketing_consent = true |
| Email not consented | email_marketing_consent = false |
| SMS consented | sms_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.
Where Consent Comes From
Consent is synced from Shopify when:
- A customer checks "Accept email marketing" at checkout
- A customer subscribes via Shopify storefront
- A Shopify
customers/updatewebhook fires and theemail_marketing_consentorsms_marketing_consentfield changes
Glancito does not override consent — Shopify is the source of truth.
Bounce Handling
Hard Bounce vs. Soft Bounce
| Type | Meaning | Glancito action |
|---|---|---|
| Hard bounce | Permanent failure — invalid address, domain does not exist | Block all future sends immediately |
| Soft bounce | Temporary failure — mailbox full, server temporarily down | Record 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:
- Is the member's
email_bounce_typeequal to"hard"? → Skip - Is
email_marketing_consentfalse? → Skip - Is
email_unsubscribedtrue? → Skip
Campaign dispatch also filters these members out at query time, so they never enter the send queue at all.
Unsubscribe Links
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):
- Start with small segments (fewer than 500 members)
- Increase volume gradually over 2–4 weeks
- 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?
- Open their member profile
- Check the Consent column — are they email-consented?
- Check the Bounce column — do they have a hard bounce?
- Check email_unsubscribed — did they unsubscribe?
- 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.