Skip to content

Zendesk vs Pylon API Integrations: Parity Guide for Engineers

Compare Zendesk and Pylon API rate limits, webhook flexibility, custom headers, and native integrations. A technical guide for engineering teams evaluating migration.

Raaj Raaj · · 16 min read
Zendesk vs Pylon API Integrations: Parity Guide for Engineers
TALK TO AN ENGINEER

Planning a migration?

Get a free 30-min call with our engineers. We'll review your setup and map out a custom migration plan — no obligation.

Schedule a free call
  • 1,200+ migrations completed
  • Zero downtime guaranteed
  • Transparent, fixed pricing
  • Project success responsibility
  • Post-migration support included

If you're evaluating whether Pylon's API and webhook architecture can replace the custom integrations you've built on Zendesk, the short answer is: Pylon covers the most common B2B integration patterns natively — Jira, Salesforce, Linear, Slack — but its ecosystem is smaller, its API is younger, and you need to audit every custom webhook and trigger for feature parity before committing.

Zendesk still wins on ecosystem breadth with a marketplace of over 1,200 apps and on platform maturity with Zendesk Integration Services (ZIS). Pylon wins when your support architecture already revolves around CRM data, engineering ticketing, and Slack channels. Its native integrations, trigger-driven webhooks, custom apps, and warehouse sync can eliminate a meaningful amount of glue code. But the gain is usually fewer middleware hops, not a bigger request budget.

API parity means the new platform can reproduce the workflows, auth patterns, payload shapes, and failure handling your team depends on. It does not mean both vendors publish REST docs.

This guide breaks down the exact API rate limits, webhook behavior, custom header support, and integration architecture on both platforms so your engineering team can make the call. For the broader migration architecture — data model mapping, object parity, and historical data transfer — see Zendesk to Pylon Migration: The CTO's Technical Guide.

The Integration Bottleneck: Why Zendesk's Marketplace Isn't Enough

Zendesk has one of the largest helpdesk app marketplaces in the industry. For B2B engineering teams, that marketplace solves maybe 30% of the integration problem. The other 70% is custom: internal dashboards pulling ticket metrics, Jira sync workflows triggered by ticket field changes, Salesforce opportunity updates based on support escalations, Opsgenie alert-to-ticket pipelines.

Those custom workflows depend on three things: API rate limits (how much you can read and write per minute), webhook flexibility (how you push events out of the helpdesk), and extensibility (whether you can build custom UI and data panels inside the agent view). Zendesk has mature answers for all three, but they come with real constraints that B2B teams hit at moderate scale.

Zendesk is primarily built for traditional ticketing workflows. If your team operates out of Slack or Microsoft Teams, Zendesk's collaboration options may be limited. It's best suited for teams that rely heavily on email or portal-based support.

When you move beyond the marketplace, Zendesk's integration architecture shows its age. The pattern is familiar: official app for the happy path, middleware for the gaps. Zendesk's own Mediaocean customer story describes a team that built a complex Jira integration and used Workato to connect Salesforce.

Pylon lets you build your own integrations through their API, Trigger Webhooks, or Custom Apps. The question is whether those three primitives cover what you currently do with Zendesk's API, webhooks, and marketplace apps. Vendor-published case studies suggest they can — Sardine reportedly moved 20+ Zapier automations into native Pylon workflows, and Builder.io consolidated six native integrations during migration. Those are vendor stories, not neutral benchmarks, but they align with the product shape in the docs.

API Rate Limits and the 429 Problem: Zendesk vs Pylon

Zendesk rate limits are plan-gated and account-wide. Every integration, webhook, agent UI action, and marketplace app shares the same request bucket.

Zendesk API rate limits range from 200 req/min on Team to 2,500 on Enterprise Plus.

Zendesk Plan Requests/Min
Team 200
Growth 200
Professional 400
Enterprise 700
Enterprise Plus 2,500
High Volume API Add-on 2,500 (replaces plan limit)

These are account-level limits, not per-agent limits. A 200-req/min Team plan limit covers your entire account — every integration, every webhook, every agent action through the UI that triggers an API call, all sharing the same bucket.

The endpoint-specific limits are where teams actually get caught:

  • Update Ticket: 30 updates per 10 minutes per user per ticket. Escalation workflows that touch the same ticket multiple times hit this fast.
  • Incremental Exports: 10 requests per minute.
  • List Tickets with pagination over 500 results drops to 50 requests per minute.
  • Background job queues cap at 30 running or queued jobs.

This is not theoretical. Outgoing Opsgenie to Zendesk API calls can periodically hit Zendesk's rate limits and thus fail with the 429 error. This results in Zendesk tickets not being closed when the corresponding Opsgenie alerts are closed. That's a real Atlassian Jira issue (OPSGENIE-1894) documenting the problem — and as of early 2025, there's no native retry logic in Opsgenie for Zendesk rate limits.

Warning

The High Volume API add-on doesn't stack. The High Volume add-on doesn't add 2,500 requests to your existing limit. It replaces your current limit with 2,500. If you're on Professional with 400 req/min and buy the add-on, you get 2,500 — not 2,900.

Pylon's rate limits are structured differently. The REST API reference shows per-endpoint ceilings: GET /issues and POST /issues at 10 requests per minute, issue updates at 20 per minute, and many account and contact reads at 60 per minute. These are tighter than Zendesk's headline numbers for individual REST operations.

The gain is architectural, not numerical. Pylon's API can be used to programmatically access and take action on data within Pylon. But the platform is designed so you don't solve everything with REST. Native Salesforce and Jira connections, outbound webhooks, account activity APIs, and warehouse sync handle the workloads that would otherwise be polling loops against low-ceiling REST endpoints. If your plan is to replace a Zendesk polling loop with a Pylon polling loop, expect a redesign, not a free performance win.

Warning

Don't design Pylon as your new bulk ETL loop. Pylon's public docs show low per-minute limits on issue endpoints. For dashboards and historical analysis, its native warehouse sync to Snowflake, BigQuery, Redshift, or S3 is the cleaner path.

Warning

Zendesk trial account restrictions: Trial accounts are limited to a maximum of 10 webhooks and a rate limit of 60 invocations per minute. You cannot accurately load-test a production-grade integration on a Zendesk trial. Don't extrapolate proof-of-concept behavior into production sizing.

Webhook Flexibility: Custom Headers, Retries, and Direct Connections

Webhooks are where the two platforms diverge most sharply for integration engineers.

Zendesk Webhooks: Capable but Constrained

Zendesk webhooks support two connection methods: event subscriptions (system-wide events like user created, organization updated) and trigger/automation connections (ticket-based conditional logic). A webhook that's subscribed to a Zendesk event can't connect to a trigger or automation. Similarly, a webhook that's connected to a trigger or automation can't subscribe to Zendesk events. You can't change an existing webhook's connection method. This is a permanent architectural decision per webhook.

For authentication, Zendesk offers API key, basic auth, and bearer token — all as first-class options. Admins can add up to five custom headers. But Zendesk's documentation is explicit about what those headers should not contain: "Don't include authentication credentials or other sensitive information in custom headers. Instead, use the supported authentication methods."

Header names must be unique, can't exceed 128 characters, and header values can contain up to 1,000 characters. Zendesk also blocks a list of reserved header name prefixes.

The real pain points for engineering teams:

  • Circuit breaker: Zendesk's circuit breaker activates when 70% of a webhook's requests fail within a 5-minute window or when 1,000+ errors occur in 5 minutes. When it trips, events during these pauses are logged as "circuit broken" but never delivered.
  • Limited retries: Only HTTP 409 responses are retried (up to 3 times), and 429/503 responses are only retried if they include a retry-after header with a value under 60 seconds. Common failure codes like 500, 502, and 504 are not retried at all.
  • No failure alerts: When webhooks start failing, Zendesk does not proactively notify you. There are no email alerts, Slack notifications, or any other mechanism to flag delivery issues. The only way to discover failures is to manually check the activity log for each webhook or poll the invocations API.
  • 12-second timeout on all webhook requests.
  • No guaranteed ordering: Webhook jobs are queued independently, so execution order is not guaranteed. If your integration depends on ordered delivery, you have a hidden risk.

Pylon Webhooks: Simpler Model, Fewer Restrictions

Specify the URL of your endpoint as well as any custom headers you'd like sent on each webhook. For example, here you can include authorization information like a Bearer token. No restriction on putting auth credentials in custom headers — this is the intended pattern in Pylon.

Pylon's webhook architecture ties directly into its Triggers system. You define "When" and "If" conditions, set the action to "Send webhook," and use templated variables to construct the exact payload shape you want. This is conceptually similar to Zendesk's trigger-to-webhook pattern, but without the split between event-subscribed and trigger-connected webhooks.

Pylon Webhook Configuration Example:

{
  "endpoint_url": "https://api.yourcompany.com/v1/webhooks/pylon",
  "events": ["issue.created", "issue.status_changed"],
  "headers": {
    "Authorization": "Bearer sk_live_123456789",
    "X-Custom-Tenant-ID": "tenant_abc"
  }
}

By supporting standard authentication patterns natively in headers, Pylon allows engineering teams to point webhooks directly at their production APIs without routing through middleware just for header injection.

Retry behavior is more aggressive than Zendesk's: Webhook delivery times out after 10 seconds. Failing attempts will retry up to four more times, according to a schedule where the final attempt occurs about 31 hours after the event was initially created.

If there are no successful attempt deliveries to a webhook destination for 7 days, the destination will change to the inactive state. When an endpoint is in the inactive state, no attempts will be made to deliver any events to this endpoint. You'll need to manually reactivate it — and Pylon doesn't send a proactive alert when this happens, so you need your own monitoring.

Pylon provides HMAC-SHA256 signature verification via the Pylon-Webhook-Signature header, using the same pattern as Stripe and other modern webhook APIs:

const crypto = require('crypto');
 
function verifyPylonSignature(req, secret) {
  const signature = req.headers['x-pylon-signature'];
  const payload = JSON.stringify(req.body);
  const expectedSignature = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
    
  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expectedSignature)
  );
}

Webhook Comparison

Capability Zendesk Pylon
Custom headers Up to 5, no auth in headers Unlimited, auth in headers supported
Auth methods API key, basic, bearer (built-in) Bearer token via custom headers
Payload templating Ticket placeholders in trigger webhooks Templated variables in trigger webhooks
Retry on 5xx Only 503 with retry-after <60s Up to 4 retries over ~31 hours
Circuit breaker Yes — 70% failure in 5 min trips it No documented circuit breaker
Failure notifications None — poll activity log manually Inactive state after 7 days (silent)
Timeout 12 seconds 10 seconds
Signature verification HMAC-SHA256 HMAC-SHA256

Native Integration Parity: What Pylon Covers

Here's a practical mapping of the integrations B2B engineering teams use most:

Integration Zendesk Pylon
Salesforce Marketplace app + API Native: sync activity and contacts into Salesforce and pull data into Pylon
HubSpot Marketplace app + API Native: sync activity and contacts into HubSpot and pull data into Pylon
Jira Marketplace app (multiple options) Native: link customer issues in Pylon to tickets in Jira
Linear No native; webhook + middleware Native: link Pylon issues with Linear issues
GitHub Marketplace app Native: link Pylon issues with GitHub issues
Slack Marketplace app (limited) Native: Slack Connect, Community
PagerDuty Marketplace app Native: trigger PagerDuty escalations using triggers engine
Opsgenie Marketplace app (rate-limit issues) Native: trigger Opsgenie escalations using triggers engine
Snowflake/BigQuery No native; export via API Native: sync analytics and issue data directly into Snowflake or BigQuery
Shortcut No native Native: link with Shortcut to pass stories to engineering

Pylon's Jira integration lets you customize how Jira ticket status changes affect your Pylon issues using Triggers. For Salesforce, Pylon's Salesforce integration allows agents to view, search, and act on Salesforce data directly within the help desk. When a support message comes in via Slack, Teams, or email, your team can instantly pull up relevant CRM fields.

The trade-off is straightforward. Zendesk gives you broader app coverage and a more mature marketplace. Pylon gives you tighter native fit when support, success, and engineering all orbit the same account record and the same Slack channels. Where Pylon doesn't have a native integration, you have three paths: Custom Apps, webhook triggers, or the REST API. For teams already maintaining Zendesk marketplace apps that are really just thin API wrappers, rebuilding on Pylon's primitives is often less total code.

Replacing Middleware: Pylon Custom Apps vs Zendesk ZIS vs Zapier

Many Zendesk integrations route through middleware — Zapier, Workato, Tray.io — because Zendesk's native constraints make direct API-to-API connections painful. But a fair comparison requires mentioning Zendesk Integration Services (ZIS), which many comparisons overlook.

Zendesk Integration Services (ZIS)

ZIS is a Zendesk-hosted integration layer that can ingest inbound webhooks, execute business logic, store links and configuration, and make third-party API calls. If you've invested in ZIS, you may have less external middleware than people assume.

The cost is platform complexity and hard limits: private ZIS integrations are only available on selected plans, flows max out at 100 seconds and 250 state transitions, event data tops out at 256 KB, and custom actions time out after 10 seconds or fail on responses over 2 MB. Zendesk also recommends disabling or filtering ZIS integrations during large migrations because event floods can exceed usage limits.

Pylon Custom Apps

Pylon Custom Apps offer a direct alternative to both middleware and marketplace sidebar apps. When configuring the app, the URL of the API endpoint will be a required field. To verify a custom app request came from Pylon, see their security docs.

The endpoint returns data displayed in the issue sidebar. Pylon sends a GET request to the endpoint with query params, and the endpoint responds with a JSON object containing the data to display.

The component schema supports cards, text, links, and nested layouts — enough to surface CRM data, deployment status, or customer health scores directly in the agent's issue view without building a full Zendesk app framework project.

Security is handled via a signature handshake. Pylon signs every request with a unique secret key using HMAC-SHA256. Your server verifies the signature, processes the context (customer email, organization ID, issue ID), and returns formatted JSON.

This pattern replaces two common middleware workflows:

  1. CRM sidebar enrichment: Instead of a Zendesk marketplace app that polls Salesforce through Zapier, build a Custom App endpoint that queries Salesforce directly and returns the JSON component schema Pylon expects.
  2. Alerting enrichment: Instead of Opsgenie → Zapier → Zendesk ticket creation (which hits rate limits during alert storms), wire Opsgenie directly to Pylon's API to create issues, and use a Custom App to display alert context in the sidebar.
Info

Pylon also supports Embedded Iframes for cases where Custom Apps' component schema isn't flexible enough. You can embed any web app inside the issue sidebar. This is the escape hatch for complex internal tools.

When Middleware Still Makes Sense

Middleware still has a place. Zapier supports Pylon actions like creating issues, accounts, and account activities. Use it when you need a connector Pylon doesn't ship natively. Don't use it as the default for workflows Pylon already handles with native integrations, webhooks, or warehouse sync.

If your current Zendesk stack includes internal dashboards or ad hoc reporting jobs, Pylon's data warehouse sync deserves special attention. Pylon documents native sync to Snowflake, BigQuery, Redshift, and S3, with selectable columns, a defined cadence, and automatic upserts. That is often a cleaner replacement for homegrown dashboard sync jobs than another REST poller.

Migrating Your Custom Integrations: The Engineering Playbook

Every custom integration needs an explicit migration plan. Here's the systematic approach.

Step 1: Audit Your Zendesk Integration Surface

Pull a complete inventory:

  • Webhooks: List all webhooks from Admin Center → Apps and integrations → Webhooks. Note the connection method (event-subscribed vs. trigger-connected), endpoint URL, auth method, and custom headers.
  • Triggers and Automations: Export all triggers and automations that reference "Notify webhook" actions. These are your event-to-webhook mappings.
  • ZIS Flows: If you use Zendesk Integration Services, document every flow, its event sources, API calls, and state transitions.
  • Marketplace Apps: List every installed app. Classify: pre-built integration (Jira, Salesforce) vs. custom internal app vs. third-party analytics.
  • Direct API Consumers: Identify every service, script, and cron job that calls the Zendesk API directly. Check your API usage dashboard for the top callers.
  • Middleware: Document every Zapier zap, Workato recipe, or Tray.io flow that connects to Zendesk.

For a deeper look at hidden complexity in migrating automations and triggers, see Your Helpdesk Migration's Secret Saboteur: Automations, Macros, and Workflows.

Step 2: Map Each Integration to a Pylon Primitive

For each Zendesk integration, determine the Pylon equivalent:

Zendesk Trigger → "Notify Webhook"  →  Pylon Trigger → "Send Webhook"
Zendesk Event Subscription Webhook  →  Pylon Trigger (condition-based) + Webhook
Zendesk Marketplace App (sidebar)   →  Pylon Custom App or Embedded Iframe
Zendesk ZIS Flow                    →  Pylon Trigger + Webhook or Custom App
Zendesk Direct API Read             →  Pylon REST API (verify endpoint parity)
Zendesk Direct API Write            →  Pylon REST API (verify rate limits)

Classify every flow into four buckets: native Pylon integration (Salesforce, Jira, alerting, warehouse sync), Pylon webhook (outbound event to internal services), Pylon Custom App (read-side context in the sidebar), or keep external middleware (long-running cross-app orchestration that no native path covers).

Step 3: Rebuild Webhooks with Header Parity

If your Zendesk webhooks use bearer token auth through Zendesk's built-in auth method, the migration is straightforward — Pylon supports the same pattern natively via custom headers. If you relied on Zendesk's API key auth (custom header name + value), configure the same key-value pair as a Pylon webhook custom header.

Watch for payload differences. Zendesk uses {{ticket.id}}, {{ticket.status}}, and similar placeholders. Pylon uses its own templated variables. You'll need to remap every placeholder to Pylon's equivalent field names.

Here's what a typical mapping looks like:

zendesk_flow:
  source: ticket status changed -> solved
  target: internal service updates linked Jira issue
  auth: proxy injects bearer token
  retries: custom backoff on 429
 
pylon_replacement:
  kickoff: issue status changed
  filters:
    - external issue source = jira
    - issue status = closed
  action: send webhook
  body:
    issue_id: "{{issue.id}}"
    account_id: "{{account.id}}"
    jira_key: "{{external_issue.key}}"
    status: closed

Replace hidden middleware behavior with an explicit mapping document and an idempotent webhook contract. If you can't write the mapping down, you don't understand the integration yet.

Step 4: Preserve External IDs and Joins

Pylon supports external IDs on accounts and contacts, and its APIs accept either internal IDs or external IDs. Use that to keep CRM records, product telemetry, and engineering tickets connected after the cutover. If you need a breadcrumb back to Zendesk, store the old Zendesk organization or ticket identifier in a Pylon external ID or custom field instead of burying it in free text.

Tip

Set external IDs on day one. Pylon accounts can be fetched and updated by external ID, contacts can carry external IDs, and account activities can be written against either internal or external IDs. This makes CRM and product joins much easier after cutover.

Step 5: Test Under Load Before Cutover

Don't trust a 5-ticket test. Simulate a burst event — an alert storm from Opsgenie, a bulk status change, a Jira sync backlog — and verify that:

  • Pylon webhooks fire within acceptable latency
  • Your endpoint handles Pylon's retry schedule correctly
  • No events are silently dropped during burst conditions
  • Custom App responses stay under the 10-second timeout

Dual-run a controlled set of accounts. Validate Salesforce field sync, Jira status round-trips, webhook signatures, custom header auth, and custom app response times. Pylon's trigger logs and version history make this phase easier to inspect than a chain of black-box automations.

Warning

Don't DIY the migration scripts without understanding the rate limit asymmetry. Writing a quick Python script to bulk-read from Zendesk and bulk-write to Pylon will hit Zendesk's 429 limits fast — especially on lower-tier plans. See Why DIY AI Scripts Fail and How to Engineer Accountability for the failure patterns we see repeatedly.

Step 6: Phase the Cutover

During bulk backfill, treat Zendesk event traffic as hazardous if you leave everything live. Zendesk recommends disabling or filtering ZIS integrations during large migrations because event spikes can exceed limits. And don't extrapolate proof-of-concept behavior from a trial account into production sizing — trial accounts are capped at 10 webhooks and 60 invocations per minute.

Where Pylon's Integration Surface Falls Short

Honesty matters here. Pylon's integration surface is younger than Zendesk's, and there are real gaps:

  • Low published REST rate limits. Pylon's per-endpoint ceilings (as low as 10 req/min for issue endpoints) mean you can't treat the REST API as a high-throughput data pipe. The native integrations and warehouse sync are designed to absorb that workload, but if your use case doesn't fit those patterns, you'll feel the limits.
  • Smaller native app ecosystem. If your team uses niche tools beyond the Jira/Salesforce/Linear core, you're building custom integrations from scratch.
  • Custom Apps are read-only sidebar panels. They surface data but don't support write-back actions from the sidebar UI without additional API calls from your endpoint.
  • Webhook inactive state is silent. If your endpoint goes down for 7 days, Pylon stops sending events without a proactive alert. You need your own monitoring.
  • No ZIS equivalent. Pylon doesn't offer a hosted multi-step orchestration engine. Complex flows that currently live in ZIS need to move to external middleware or your own infrastructure.
  • If you run a high-volume B2C operation with thousands of transactional tickets daily, require extensive telephony/voice support integration, or need highly complex, enterprise-grade custom reporting with SQL access, Zendesk is still the stronger platform.

What This Means for Your Migration Decision

For B2B engineering teams running Jira + Salesforce + Slack as their core stack, Pylon's native integrations eliminate a meaningful amount of middleware and custom webhook plumbing. The webhook architecture is more permissive — custom headers with auth tokens, longer retry windows, flexible payload templates. The Custom Apps framework gives you a clean path to build sidebar integrations without the overhead of the Zendesk Apps Framework.

But if your integration surface extends into niche marketplace apps, complex multi-step ZIS automations, or high-volume API patterns that depend on Zendesk's documented (if frustrating) rate limits, plan your migration with an explicit integration audit first. Don't assume parity — verify it endpoint by endpoint.

Plan this as an integration rewrite with a helpdesk migration attached, not as a ticket export project. That framing matches what the platforms actually are.

At ClonePartner, we've handled migrations where the ticket and user data moved smoothly but the integration layer was the real blocker — undocumented Zendesk triggers, middleware dependencies nobody mapped, ZIS flows that broke silently. When we run a Zendesk-to-Pylon migration, the integration audit is the first deliverable, not an afterthought.

Frequently Asked Questions

What are Zendesk's API rate limits per plan?
Zendesk enforces account-wide rate limits: 200 req/min on Team and Growth, 400 on Professional, 700 on Enterprise, and 2,500 on Enterprise Plus. The High Volume API add-on replaces (not adds to) your plan limit with 2,500 req/min. Endpoint-specific limits like 30 updates per 10 minutes per user per ticket are often the first constraint you hit.
Does Pylon support custom headers and Bearer tokens in webhooks?
Yes. Pylon's webhook configuration lets you specify custom headers including Bearer tokens directly in the webhook settings — it's the intended auth pattern. Zendesk also supports bearer token as a built-in webhook auth method, but restricts authentication credentials in its custom headers field.
What happens when Zendesk webhooks fail?
Zendesk retries HTTP 409 responses up to 3 times, and 429/503 only if a retry-after header under 60 seconds is present. Common 5xx errors like 500, 502, and 504 are not retried. A circuit breaker trips when 70% of requests fail within 5 minutes, silently dropping events during the pause. Zendesk does not send failure notifications.
How do Pylon Custom Apps work for engineering teams?
Pylon Custom Apps let you build sidebar panels in the issue view that pull data from your own API endpoints. Pylon sends a signed GET request with issue and account context, and your endpoint returns a JSON component schema (cards, text, links). This replaces Zendesk marketplace sidebar apps and middleware for CRM enrichment. Custom Apps are read-only; write-back requires separate API calls.
Does Pylon have full API parity with Zendesk?
Not as a strict superset. Zendesk has the bigger marketplace, ZIS for hosted orchestration, and clearly documented rate limits. Pylon offers tighter native CRM and ticketing integrations, more permissive webhooks, and warehouse sync — but its REST rate limits are low (as low as 10 req/min on some endpoints) and its app ecosystem is smaller. Verify parity endpoint by endpoint before committing.

More from our Blog

Your Helpdesk Migration’s Secret Saboteur: Automations, Macros, and Workflows
Help Desk

Your Helpdesk Migration’s Secret Saboteur: Automations, Macros, and Workflows

Migrating automations, macros, and workflows is the secret saboteur of most helpdesk migration projects. Standard tools often fail because they can't translate the complex, custom logic that acts as your support team's "central nervous system". This guide provides a battle-tested, 3-phase framework to successfully audit, "translate," and test these intricate workflows. Learn to deconstruct your old system and rebuild it perfectly in the new one, avoiding the common pitfalls that cause 83% of data migrations to fail.

Raaj Raaj · · 8 min read