Linje

SendGrid Inbound Parse alternative

Keep SendGrid for sending. Route replies with application context.

SendGrid Inbound Parse is a capable general-purpose inbound webhook. Choose Linje when the main job is to attach every reply to the correct order, claim, case, or workflow without maintaining your own address-to-object mapping.

Different abstractions

Parsed email webhook or application-aware reply route?

SendGrid receives mail for a configured hostname and posts parsed fields and attachments as multipart/form-data. It supports webhook security policies and retries unsuccessful 5xx requests. Linje starts one level higher: your application creates an opaque reply address with immutable metadata, then receives normalized JSON carrying that same context.

Concern SendGrid Inbound Parse Linje reply route
Inbound payload Parsed multipart form fields, attachments, or raw MIME Versioned JSON plus attachment download references
Object correlation Your application creates and persists the recipient mapping Route metadata is returned in the inbound event
Address lifecycle Your application owns generated tokens and expiry Create, list, expire, enable, or disable route resources
Delivery operations Automatic retry for unsuccessful webhook delivery Attempt history, stable event identity, and manual replay

Read the official SendGrid Inbound Parse setup documentation.

Application context

Create one reply route for one real object.

curl -fsS \
  -H "Authorization: Bearer $LINJE_PROJECT_TOKEN" \
  -H "Idempotency-Key: 018f47d2-89ab-4cde-8123-456789abcdef" \
  -H "content-type: application/json" \
  -d '{
    "inbox-id":"support",
    "metadata":{
      "ticket_id":"ticket_4821",
      "account_id":"acct_91"
    }
  }' \
  https://api.linje.systems/v1/reply-routes
{
  "reply-route": {
    "id":"route_...",
    "address":"r+012345...@in.linje.systems",
    "metadata":{
      "ticket_id":"ticket_4821",
      "account_id":"acct_91"
    }
  }
}

No outbound migration

Use the route as Reply-To in your SendGrid message.

{
  "personalizations":[{
    "to":[{"email":"customer@example.com"}]
  }],
  "from":{"email":"support@example.com"},
  "reply_to":{"email":"r+012345...@in.linje.systems"},
  "subject":"Ticket ticket_4821",
  "content":[{"type":"text/plain","value":"Reply with the requested details."}]
}

Your SendGrid templates, sending domains, reputation, and delivery workflow stay in place. Only the Reply-To value changes for messages that need a correlated response.

Reply to application event

Receive JSON with the original route metadata.

POST https://app.example.com/linje/inbound
x-linje-inbound-id: ...
x-linje-delivery-id: ...
x-linje-timestamp: ...
x-linje-signature: sha256=...

{
  "schema":"linje.inbound-email.v1",
  "route":{
    "id":"route_...",
    "metadata":{
      "ticket_id":"ticket_4821",
      "account_id":"acct_91"
    }
  },
  "content":{"text":"Here are the requested details."},
  "attachments":[]
}

Decision guide

Use the boundary that matches the job.

Choose SendGrid Inbound Parse

You want general inbound parsing and are comfortable owning routing state and delivery operations.

Choose Linje as a sidecar

You want to keep SendGrid outbound while replies arrive with managed object context.

Choose Linje both ways

You want one API boundary for transactional sending and inbound application email.

Read the complete reply-by-email guide.

Pricing

Free during preview. Paid plans start at $5/month.

Create an account and test the complete reply flow without entering payment details. Creating and keeping reply routes does not consume message usage. Each customer reply counts once when Linje accepts it; webhook retries and replay are included. After preview, choose 500 messages free, 5,000 for $5/month, or 50,000 for $25/month.

See pricing and usage details.

Self-service quickstart

Add replies to one real SendGrid email flow.

Create one route, use it as Reply-To, and verify that a real response reaches the correct application object.

Add replies to a SendGrid flow Read the API docs