← Back to Portfolio
Operations, People & Technical Support · Portfolio Sample

Technical Writing Portfolio

Specious Coda-Bishop · Operations, People & Technical Support

Four reference-quality playbook documents demonstrating technical depth, process documentation, and cross-audience communication across ops and HR systems. Each document is written for a different primary audience — from technical support agents to non-technical finance and HR stakeholders — to show range as well as depth.

Capability 1 Technical depth for practitioner audiences

API troubleshooting and SQL diagnostics written for people who need to use them under real ticket pressure — precise, structured, and opinionated about resolution order.

Capability 2 Cross-audience translation

EOR payroll explainer written for non-technical stakeholders with no assumed background. Same domain knowledge, completely different register and structure.

Capability 3 Process design embedded in documentation

The escalation playbook doesn't describe a process — it is the process. Decision logic, SLAs, and routing criteria are structured to replace tribal knowledge, not supplement it.

Capability 4 Knowing what not to say

Every document is scoped. The SQL guide covers missing and null records, not wrong values. The EOR explainer covers the payroll cycle, not employment law. Scope discipline is a writing skill.

Contents
#DocumentAudience
01API Troubleshooting Playbook — Zendesk → Slack Integration FailureTechnical ops / support agents
02SQL Missing Data Audit Guide — Diagnosing Absent or Incomplete RecordsOps analysts / payroll leads
03System Explainer: EOR Payroll ProcessingNon-technical stakeholders
04Support Escalation Playbook — Tiered Decision Logic for Ops/HR TicketsSupport agents / ops coordinators
01
API Troubleshooting Playbook
Purpose

This playbook guides technical ops staff through diagnosing and resolving failures in the Zendesk–Slack integration. It covers webhook misconfigurations, authentication failures, payload schema mismatches, and silent delivery failures. It assumes working knowledge of both platforms and access to Zendesk Admin, Slack App management, and server/webhook logs.

Background — How the Integration Works

Zendesk sends event-triggered notifications to Slack via outbound webhooks or the official Zendesk for Slack app. The two main delivery paths are:

PathMethodCommon Use
Native AppOAuth + Slack Events APITicket sidebar, /zendesk slash commands
Custom WebhookHTTP POST to Slack Incoming Webhook URLCustom alerts, ticket routing notifications
Zendesk Triggers + HTTP TargetREST POST to Slack WebhookConditional alerts based on ticket rules

Failures can occur at any point in this chain. The first step in any investigation is identifying which path is broken.


Step 1 — Establish the Failure Type

Classify Before You Investigate

Before touching any configuration, identify which failure class you're dealing with. This avoids chasing the wrong layer.

SymptomLikely Failure Layer
Notifications stopped entirelyWebhook URL expired or channel deleted
Some notifications arrive, some don'tTrigger condition logic or filter mismatch
Notifications arrive but are malformedPayload schema / template error
403 or 401 errors in logsAuthentication / token expiry
200 OK in logs but nothing in SlackWebhook URL is stale (Slack returns 200 on some invalid URLs)
Slash commands broken but alerts fineOAuth scope issue or app reinstall required

Step 2 — Check Webhook Delivery Logs

Zendesk Side

Navigate to Admin Center → Apps and Integrations → Targets (for legacy HTTP targets) or Webhooks (for newer webhook config).

  1. Open the relevant webhook or HTTP target.
  2. Select Activity or Delivery Log.
  3. Filter for failed deliveries in the relevant timeframe.
  4. Note the HTTP response code returned by Slack.
Key Codes

200 = delivered (but check Slack anyway)  ·  404 = webhook URL not found  ·  410 = webhook URL revoked by Slack  ·  403/401 = auth failure  ·  5xx = Slack-side error, usually transient.

Slack Side

In Slack, navigate to your workspace App Management → Custom Integrations → Incoming Webhooks.

  1. Confirm the webhook URL still exists and is active.
  2. Check which channel it posts to — channels get archived or renamed.
  3. If using the Zendesk App rather than a custom webhook, go to Installed Apps → Zendesk and check whether the app shows a configuration error or requires reauthorisation.

Step 3 — Test the Webhook Directly

Isolate the Integration from Zendesk

Before debugging Zendesk trigger logic, confirm the webhook URL itself is functional by sending a test payload directly.

# Send a test POST to your Slack webhook URL
curl -X POST -H 'Content-type: application/json' \
  --data '{"text": "Webhook test from ops debug - ignore"}' \
  https://hooks.slack.com/services/YOUR/WEBHOOK/URL

# Expected: HTTP 200, message appears in target Slack channel
# If you get 'no_service' or 'invalid_payload': webhook is broken at Slack end
# If you get a 200 but no message: check channel permissions or archival
Key Point

If this test fails, the webhook URL needs to be regenerated. Do not continue debugging Zendesk configuration until the URL is confirmed live.


Step 4 — Inspect Payload Schema

Common Payload Errors

  • Unescaped special characters in ticket subject or body fields breaking JSON structure
  • Deprecated attachment fields — Slack has migrated to Block Kit; legacy payload formats may still post but render incorrectly
  • Missing required fields — Slack requires at minimum either text or a blocks array
  • Channel field included in payload for an Incoming Webhook — Incoming Webhooks post to a fixed channel; adding a channel field causes rejection

Valid Minimal Payload

{
  "text": "[{{ticket.status}}] Ticket #{{ticket.id}}: {{ticket.title}}",
  "blocks": [
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": "*Ticket #{{ticket.id}}*\n{{ticket.title}}"
      }
    }
  ]
}
Note

Always include a top-level text field alongside blocks. Slack uses it as a fallback for notifications and accessibility. Blocks-only payloads are valid but will show no preview text in mobile push notifications.


Step 5 — Auth and OAuth Issues

Token Expiry and Scope Failures

If the Zendesk for Slack app (rather than a raw webhook) is being used, failures are more likely to be OAuth-related.

  1. In Zendesk, go to Admin Center → Integrations → Slack. Check whether the integration shows a reconnection prompt — this indicates the OAuth token has expired or been revoked.
  2. In Slack, go to Installed Apps → Zendesk → App Settings and confirm the app has the required scopes: chat:write, channels:read, users:read.
  3. If scopes have changed (e.g. after a Slack policy update), the app will need to be reauthorised by a Slack admin.
Watch For — Silent Token Revocation

If a Slack admin revoked the app's token without informing the Zendesk admin, all notifications will silently stop. There will be no error in Zendesk because Zendesk receives a 200 from Slack's API even after token revocation in some scenarios. Always cross-check both sides.


Resolution Checklist
CheckConfirmed
Webhook URL tested directly and returns 200 with message
Zendesk delivery log shows no 4xx errors for past 24h
Payload schema validated (text field present, no stale attachment format)
Target Slack channel confirmed active and not archived
OAuth token/scopes confirmed if using Zendesk App
Trigger conditions reviewed and tested with a live ticket
Incident logged with root cause and resolution for future reference
02
SQL Missing Data Audit Guide
Purpose

This guide walks through a structured approach to diagnosing missing or incomplete records in operational databases — payroll runs, headcount exports, onboarding completions, or any dataset where expected rows are absent. It assumes basic SQL proficiency and read access to the relevant tables.

Step 1 — Define 'Missing'

Know What You're Looking For Before You Query

Missing data has three distinct forms. Treating them the same leads to querying the wrong thing.

TypeDescriptionExample
Row missing entirelyRecord does not exist in the tableEmployee not in payroll run
Row exists, field is NULLRecord present but field has no valueStart date column is NULL
Row exists, field is wrongRecord present but value is incorrect or staleWrong cost centre code

This guide focuses on the first two. Establish which type you have before writing any query.


Step 2 — Establish the Expected Population

Build a Source of Truth First

The most common mistake in missing data investigations is jumping straight to the broken table without first establishing what should be there. Define your expected population from a reliable source, then compare.

-- Step 1: Define expected population
-- All active employees as of the payroll run date
SELECT
  e.employee_id,
  e.full_name,
  e.employment_status,
  e.start_date
FROM employees e
WHERE e.employment_status = 'active'
  AND e.start_date <= '2026-03-01'   -- payroll run date
  AND (e.end_date IS NULL OR e.end_date > '2026-03-01');

-- Step 2: See who actually appeared in the run
SELECT DISTINCT employee_id
FROM payroll_runs
WHERE run_date = '2026-03-01';

-- Step 3: Find the gap
SELECT
  e.employee_id,
  e.full_name,
  e.start_date
FROM employees e
WHERE e.employment_status = 'active'
  AND e.start_date <= '2026-03-01'
  AND (e.end_date IS NULL OR e.end_date > '2026-03-01')
  AND e.employee_id NOT IN (
    SELECT employee_id FROM payroll_runs
    WHERE run_date = '2026-03-01'
  );
Tip — NOT IN and NULLs

Use NOT IN with caution if the subquery might return NULLs — NOT IN with a NULL in the list returns no rows. Use NOT EXISTS or a LEFT JOIN instead if NULL values are possible in the employee_id column of payroll_runs.


Step 3 — Safer Gap Query with LEFT JOIN

Handling NULLs Correctly

-- LEFT JOIN approach: safer when NULLs may be present
SELECT
  e.employee_id,
  e.full_name,
  e.start_date,
  pr.run_date   -- will be NULL if employee is missing from run
FROM employees e
LEFT JOIN payroll_runs pr
  ON e.employee_id = pr.employee_id
  AND pr.run_date = '2026-03-01'
WHERE e.employment_status = 'active'
  AND e.start_date <= '2026-03-01'
  AND (e.end_date IS NULL OR e.end_date > '2026-03-01')
  AND pr.employee_id IS NULL;   -- the gap condition

Step 4 — Check for NULLs in Key Fields

When the Row Exists But the Data Doesn't

If rows are present but downstream reports are broken, NULL fields are usually the cause. Check systematically.

-- Audit NULLs across key fields for active employees
SELECT
  employee_id,
  full_name,
  CASE WHEN cost_centre IS NULL THEN 'MISSING' ELSE 'OK' END AS cost_centre_status,
  CASE WHEN contract_type IS NULL THEN 'MISSING' ELSE 'OK' END AS contract_type_status,
  CASE WHEN pay_currency IS NULL THEN 'MISSING' ELSE 'OK' END AS currency_status,
  CASE WHEN bank_account_id IS NULL THEN 'MISSING' ELSE 'OK' END AS bank_status
FROM employees
WHERE employment_status = 'active'
  AND (
    cost_centre IS NULL
    OR contract_type IS NULL
    OR pay_currency IS NULL
    OR bank_account_id IS NULL
  );

-- Count scale of the problem
SELECT
  COUNT(*) AS total_active,
  SUM(CASE WHEN cost_centre IS NULL THEN 1 ELSE 0 END) AS missing_cost_centre,
  SUM(CASE WHEN bank_account_id IS NULL THEN 1 ELSE 0 END) AS missing_bank
FROM employees
WHERE employment_status = 'active';

Step 5 — Trace the Data Origin

Find Where It Should Have Come From

Once you know which records are missing, trace backwards through the data pipeline to find where the gap was introduced.

Pipeline StageWhat to Check
Source system (HRIS / EOR platform)Was the employee created? Is their profile complete?
ETL / sync jobDid the sync run? Did it error silently? Check job logs.
Staging or intermediary tableDoes the record exist here but not in the final table?
Transform logicIs there a filter condition excluding the record unintentionally?
PermissionsDoes the query user have access to all partitions / schemas?
-- Check if record exists in staging but not production
SELECT 'staging' AS source, employee_id FROM staging.employees
WHERE employee_id = '12345'
UNION ALL
SELECT 'production' AS source, employee_id FROM employees
WHERE employee_id = '12345';

-- If it's in staging but not production, the ETL step is where it dropped

Resolution and Documentation
  1. Document the gap: how many records, which fields, which timeframe.
  2. Identify the root cause layer (source, sync, transform, permissions).
  3. Apply fix at the correct layer — patching production data without fixing the source will recur.
  4. Re-run the gap query after the fix to confirm zero results.
  5. Add a monitoring query or alert if this data is business-critical.
Important

Never delete or overwrite records during a missing data investigation without a backup and a confirmed understanding of why the record is wrong. What looks like a duplicate is sometimes valid — e.g. rehires, contractor-to-employee conversions, multi-entity employees.

03
System Explainer: EOR Payroll Processing
Audience

This document is written for non-technical stakeholders — team leads, finance partners, or new hires who need to understand what an EOR platform does, why payroll timelines work the way they do, and what happens when something goes wrong. No technical background is assumed.

What Is an EOR?

The Short Version

When your company hires someone in a country where you don't have a legal entity, you can't pay them directly — you're not registered as an employer there. An Employer of Record (EOR) solves this by becoming the legal employer on paper, handling payroll, taxes, and compliance in that country on your behalf.

Your employee still works for you in practice. The EOR handles the legal and administrative layer you can't.


The Payroll Cycle

How a Payment Gets From You to Your Employee

The process is more involved than a direct bank transfer. Here is what happens each month, in order:

StageWhat HappensWho Acts
1. Data collectionEOR platform collects salary, expenses, and changes for the periodHR / Ops
2. Payroll calculationPlatform calculates gross pay, tax, social contributions per local lawEOR platform
3. Invoice generationEOR invoices your company for total cost (salary + employer contributions + fee)EOR
4. Funds transferYour company transfers funds to EORFinance
5. Local payroll runEOR pays the employee and remits taxes to local authoritiesEOR
6. Payslip deliveryEmployee receives payslip through the platformEOR platform
Why Does It Take So Long?

Steps 3–5 often span 5–10 business days because EORs must account for bank processing times in multiple countries, local payroll authority deadlines, and currency conversion. A delay at any stage cascades to the next.


What Can Go Wrong
IssueWhat's HappeningFirst Step
Employee not in payroll runEmployee record was not submitted or approved before the cutoffCheck if onboarding was completed in the platform before the cutoff date
Payslip shows wrong amountSalary data, FX rate, or benefit deductions may be incorrectCompare payslip breakdown against the contract and raise a query with the EOR
Payment delayedFunds transfer from your company may not have cleared in timeCheck with Finance that the EOR invoice was paid by the required date
Tax code incorrectEmployee's tax situation may not have been set up correctlyEOR needs the employee's local tax ID or residency documentation
Benefits deduction missingBenefit enrolment may not have synced to payroll in timeConfirm enrolment was completed before the platform's benefits cutoff

What the Platform Does vs. What Your Team Does

A common source of confusion is who is responsible for what. The EOR platform automates a lot, but your ops and HR team still owns key inputs.

Your Team OwnsThe EOR Platform Handles
Submitting employee data accurately and on timeCalculating local taxes and contributions
Approving changes before the payroll cutoffGenerating compliant payslips
Ensuring Finance pays EOR invoices on timeRemitting taxes to local authorities
Managing employee queries about their contractProcessing salary payments in local currency
Offboarding employees and updating the platformMaintaining compliance with local employment law
Remember

The EOR platform processes what it's given. Errors in the output almost always trace back to incomplete or late input. The single most effective thing your team can do to prevent payroll issues is submit changes early and check the platform's cutoff calendar at the start of each month.

04
Support Escalation Playbook
Purpose

This playbook defines how ops and HR support tickets should be triaged, routed, and escalated. It is designed to reduce resolution time, prevent over-escalation, and ensure the right person handles each issue at the right level. It is written for support agents, ops coordinators, and first-line HR contacts.

The Three-Tier Model
TierWho Handles ItTypical Resolution Time
Tier 1 — Self-serve / First responseSupport agent or HR coordinatorSame day
Tier 2 — Specialist reviewSenior ops, payroll lead, or HRBP1–3 business days
Tier 3 — Escalation / ExternalEOR provider, legal, platform support3–5+ business days

The goal is to resolve as much as possible at Tier 1 and only escalate when the issue genuinely requires it. Tier 3 should be rare.


Tier 1 — First Response

Criteria for Tier 1

A ticket stays at Tier 1 if all of the following are true:

  • The issue can be resolved using existing documentation, platform access, or standard process
  • No changes to employment terms, payroll, or compliance are required
  • The employee or requester is not in distress and the issue is not time-critical
  • No third-party action (EOR, legal, benefits provider) is required

Tier 1 Examples

Ticket TypeResolution Path
How do I update my bank details?Direct to platform self-serve guide
I can't log into the HR systemPassword reset or IT handoff
When is the next payroll cutoff?Check cutoff calendar, reply directly
How do I request leave?Point to policy doc or HRIS walkthrough
I need a copy of my payslipDownload from platform or generate on their behalf

Tier 2 — Specialist Review

Criteria for Escalation to Tier 2

Escalate to Tier 2 when any of the following apply:

  • The issue involves a payroll discrepancy or missed payment
  • A change to contract terms, salary, or working hours is involved
  • The ticket requires cross-system investigation (e.g. HRIS data does not match payroll platform)
  • The issue has been open at Tier 1 for more than one business day without resolution
  • The employee is asking about tax, legal entitlements, or compliance matters

How to Escalate to Tier 2

  1. Add a clear summary note to the ticket: what was reported, what was investigated, what is unresolved.
  2. Tag or assign to the relevant specialist using your ticketing system's assignment rules.
  3. Do not close or put the ticket on hold — keep it active and update the employee that their issue is being reviewed.
  4. If the issue is time-critical (e.g. employee has not been paid), flag as urgent and contact the specialist directly rather than waiting for queue pickup.

Tier 3 — External Escalation

Criteria for Escalation to Tier 3

Tier 3 involves escalating outside your team to an EOR provider, benefits vendor, legal counsel, or platform support. This should only happen when:

  • The issue requires the EOR to take action on their system (e.g. missed payroll run, incorrect tax filing)
  • A platform bug or outage is confirmed or suspected
  • Legal advice or a formal employment law determination is needed
  • A data protection or compliance incident is involved

External Escalation Process

  1. Confirm internally that the issue cannot be resolved without external action.
  2. Gather all relevant data before contacting the third party: employee ID, ticket history, dates, error messages, screenshots.
  3. Use the designated escalation channel for the provider — do not use general support queues for urgent issues.
  4. Log the escalation reference number in the original ticket.
  5. Set a follow-up reminder. Do not leave external escalations unmonitored.
Important — Payroll Escalations to EOR

When escalating payroll issues to an EOR, always include:

  • The employee's contract country
  • The payroll run date
  • The exact discrepancy amount

Incomplete escalations significantly increase resolution time.


Escalation Decision Quick Reference
QuestionIf Yes →If No →
Can this be resolved with existing docs/access?Resolve at Tier 1Move to next question
Does it involve payroll, salary, or compliance?Escalate to Tier 2Move to next question
Does it require EOR or external vendor action?Escalate to Tier 3Review with Tier 2 before escalating
Is it a potential data/legal incident?Escalate to Tier 3 immediately + notify managerProceed with standard triage

SLAs and Expectations
TierFirst Response SLAResolution TargetBreach Action
Tier 14 business hoursSame dayEscalate to Tier 2
Tier 21 business day1–3 business daysFlag to team lead
Tier 31 business day (your acknowledgement to employee)Per vendor SLAEscalate internally and chase vendor
Note

SLAs apply from the moment a ticket is received, not from when it is first read. Ensure ticket queues are monitored during business hours and that out-of-office cover is in place for critical queues.