skills/customer-crm/customer-support-integration/SKILL.md
Connect your helpdesk (Gorgias, Zendesk, Intercom) to your store so support agents see full order history and customer details without switching tools
npx skillsauth add finsilabs/awesome-ecommerce-skills customer-support-integrationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Connecting your helpdesk to your store automatically surfaces order history, tracking information, and customer spend inside every support ticket — reducing average handle time by 40–60% because agents don't switch between systems. For Shopify, Gorgias is the purpose-built helpdesk that's native to the platform. For other platforms and for Zendesk/Intercom users, dedicated integration apps connect the systems. Only build a custom integration if you need deep two-way automation (auto-create tickets from order events, VIP routing, CSAT sync back to CRM) that off-the-shelf apps don't provide.
| Platform | Best Helpdesk | Why | |----------|--------------|-----| | Shopify | Gorgias | Purpose-built for Shopify; deep order data access, macro variables that pull order info, 1-click actions (refund, cancel, reorder) from within the ticket | | Shopify | Zendesk | Good for teams that already use Zendesk; install the Shopify app for Zendesk from the App Store | | WooCommerce | Gorgias or Freshdesk | Gorgias supports WooCommerce; Freshdesk + WooCommerce plugin for teams on Freshdesk | | BigCommerce | Gorgias or Zendesk | Both have BigCommerce integrations in their app marketplaces | | Custom / Headless | Zendesk or Intercom with custom integration | Build a sidebar app to inject order context into tickets |
Option A: Gorgias (recommended for Shopify)
Gorgias is the most widely-used Shopify support helpdesk with the deepest platform integration.
What Gorgias shows agents automatically:
Setting up automation rules:
1-click actions from within Gorgias:
Gorgias macros (template responses with dynamic variables):
Your order {{order.name}} is currently {{order.fulfillment_status}}Gorgias for WooCommerce:
Freshdesk for WooCommerce:
Manual integration with Zendesk:
Gorgias for BigCommerce:
Zendesk for BigCommerce:
Build a Zendesk Sunshine App (sidebar panel) or Intercom Canvas Kit app that injects order context into every ticket:
Zendesk sidebar app — data endpoint:
// GET /api/support/[email protected]
export async function getZendeskContext(req: Request, res: Response) {
const customerEmail = (req.query.email as string)?.toLowerCase();
if (!customerEmail) return res.json({ customer: null, orders: [] });
const [customer, recentOrders] = await Promise.all([
db.customers.findByEmail(customerEmail, { include: ['segmentScore'] }),
db.orders.findMany({
where: { customerEmail },
orderBy: { createdAt: 'desc' },
take: 5,
include: { lineItems: { include: { product: true } }, shipments: true },
}),
]);
res.json({
customer: customer ? {
lifetimeValue: customer.totalSpentCents / 100,
orderCount: customer.orderCount,
segment: customer.segmentScore?.segment,
tags: customer.tags,
} : null,
orders: recentOrders.map(o => ({
number: o.orderNumber,
status: o.status,
total: o.totalCents / 100,
createdAt: o.createdAt,
trackingUrl: o.shipments[0]?.trackingUrl,
items: o.lineItems.map(i => ({ name: i.product.name, quantity: i.quantity })),
})),
});
}
Route high-value tickets to VIP queue:
// Called when a new Zendesk ticket is created (via Zendesk webhook)
export async function applyTicketRouting(ticketId: string) {
const ticket = await fetchZendeskTicket(ticketId);
const customerEmail = ticket.requester?.email?.toLowerCase();
if (!customerEmail) return;
const customer = await db.customers.findByEmail(customerEmail, { include: ['segmentScore'] });
if (!customer) return;
const isVIP = ['champions', 'cannot_lose_them'].includes(customer.segmentScore?.segment ?? '');
const isHighValue = customer.totalSpentCents >= 100000; // $1,000+
if (isVIP || isHighValue) {
await fetch(`https://${process.env.ZENDESK_SUBDOMAIN}.zendesk.com/api/v2/tickets/${ticketId}.json`, {
method: 'PUT',
headers: { Authorization: getZendeskAuthHeader(), 'Content-Type': 'application/json' },
body: JSON.stringify({
ticket: {
priority: 'urgent',
group_id: process.env.ZENDESK_VIP_GROUP_ID,
tags: [...(ticket.tags ?? []), 'vip-customer'],
},
}),
});
}
}
// Auto-create ticket on delivery failure
export async function onDeliveryFailed(shipmentId: string) {
const shipment = await db.shipments.findById(shipmentId, { include: ['order.customer'] });
await fetch(`https://${process.env.ZENDESK_SUBDOMAIN}.zendesk.com/api/v2/tickets.json`, {
method: 'POST',
headers: { Authorization: getZendeskAuthHeader(), 'Content-Type': 'application/json' },
body: JSON.stringify({
ticket: {
subject: `Delivery failed — Order #${shipment.order.orderNumber}`,
comment: { body: `Delivery attempt failed on ${new Date().toDateString()}. Carrier: ${shipment.carrier}. Tracking: ${shipment.trackingNumber}.` },
requester: { email: shipment.order.customer.email },
priority: 'high',
tags: ['delivery-failure', 'auto-created'],
},
}),
});
}
Ensure your most valuable customers get faster responses by routing their tickets to your best agents.
Gorgias routing rules:
Customer → Total spent → is greater than → $500Add tag → vip, Assign to → VIP Support Team, Set priority → UrgentZendesk trigger:
Define SLA targets:
| Problem | Solution |
|---------|----------|
| Agent sees wrong customer because email lookup is case-sensitive | Normalize all emails to lowercase before lookup; [email protected] and [email protected] must resolve to the same customer |
| Webhook payload not verified | Implement HMAC signature verification using the Zendesk/Gorgias webhook signing secret before processing any payload |
| CSAT sync creates duplicate customer records | Always look up by email first; never create a new customer record from a support webhook — link to existing or skip |
| Auto-created tickets missing order context | Set the order ID in a custom ticket field at creation time; this enables bidirectional sync and accurate routing |
tools
Let shoppers save products to a wishlist, share it with friends, and get notified when saved items come back in stock or drop in price
development
Build a themeable storefront with design tokens and CSS custom properties that supports white-labeling, multi-brand variants, and dark mode
development
Speed up product discovery with instant search suggestions, fuzzy typo matching, and category-aware results powered by Algolia or Elasticsearch
development
Build a mobile-first storefront with thumb-friendly navigation, sticky add-to-cart buttons, and touch-optimized components for high mobile conversion