{
  "theme": {
    "ink": "#16243d",
    "brass": "#956d29",
    "paper": "#fcfcfd"
  },
  "proofs": [
    {
      "id": "dialer-rules",
      "url": null,
      "name": "Dialler rule engine",
      "stack": [
        "Next.js",
        "TypeScript",
        "Postgres",
        "Drizzle",
        "OAuth2 + PKCE",
        "On-device LLM"
      ],
      "proves": "Query compilation",
      "runnable": false,
      "description": "Campaign and contact-list management for contact-centre tenants. An operator writes conditions over the live columns, either in a visual builder or as a SQL WHERE clause, previews the matching set, and then applies bulk actions to it: priority, urgency, agent assignment, disabling contacts. Every run is audited per contact, and a rule can run on a schedule instead of by hand.",
      "engineeringNote": "The condition tree is compiled into the platform's own filter parameters, and only the leaves of a top-level AND chain are pushed down, so a wrong push can never widen the set the action runs against; the remainder is evaluated locally. Which parameters are supported was not assumed: the API ignores unknown parameters silently, so one counts as supported only after a deliberately non-matching value is shown to shrink the result count."
    },
    {
      "id": "reporting-platform",
      "url": null,
      "name": "Agentic Report Studio",
      "stack": [
        "Next.js",
        "TypeScript",
        "BigQuery",
        "Postgres",
        "Tool-calling agent"
      ],
      "proves": "Second place, AI hackathon",
      "runnable": false,
      "description": "Reporting product for tenants whose requirements fall outside the platform's standard reports. Users describe what they need and get a governed query against the warehouse. Second place at the AloTech AI Hackathon, July 2026, and in production afterwards with real tenants.",
      "engineeringNote": "No generated query executes until it passes a dry-run cost estimate against configured limits, so an expensive mistake is refused rather than billed. 67 ordered migrations, with separate unit, API, end-to-end and security suites."
    },
    {
      "id": "report-studio-mobile",
      "url": null,
      "name": "Reporting client for iOS and Android",
      "stack": [
        "Flutter",
        "Dart",
        "Riverpod",
        "go_router",
        "Material 3"
      ],
      "proves": "Mobile delivery",
      "runnable": false,
      "description": "Phone client for the reporting product, built to match the web app screen for screen rather than offer a reduced version of it: conversational reporting with streamed answers, saved reports, and dashboards with cross-filtering and drill-down. Routes are deep-linkable and mirror the web paths, and the interface ships in Turkish and English.",
      "engineeringNote": "Sign-in reuses the platform's existing OAuth flow inside an in-app web view and lifts the resulting session cookie into the native cookie store, so the phone client talks to the same backend with no second authentication path to keep in step. The 2,122 interface strings were taken from the web app verbatim rather than translated again, which is what keeps the two clients saying the same thing."
    },
    {
      "id": "curyy",
      "url": null,
      "name": "Curyy",
      "stack": [
        "Kotlin",
        "Android",
        "Jetpack Compose",
        "Health Connect",
        "MCP",
        "Postgres"
      ],
      "proves": "A product owned end to end",
      "runnable": false,
      "description": "Native Android product I build and run myself, aimed at the Philippines: it logs what you eat and gives allergy, calorie and budget guidance in a floating overlay. With per-app consent it reads the screens of allow-listed food delivery apps as text, so an order becomes a logged meal without anyone typing it in. It writes nutrition back to the phone's health platform, tracks spending against a budget, and exposes its own MCP server so an assistant can read the diary and log a meal.",
      "engineeringNote": "Text, never screenshots, and only from apps the user has allow-listed one at a time — a tool that reads your screen has to be narrower than it is capable of being, or nobody should install it. The screen classifier has a parity test so the on-device path and the reference path cannot drift apart, and MCP tokens are read-only unless a write scope is granted explicitly."
    },
    {
      "id": "crm-bridge",
      "url": null,
      "name": "CRM to contact-centre bridge",
      "stack": [
        "TypeScript",
        "Turborepo",
        "Next.js",
        "Postgres",
        "OAuth2",
        "HubSpot"
      ],
      "proves": "Integration middleware",
      "runnable": false,
      "description": "Lets a sales team push leads and deals out of their CRM straight into a dialling campaign, with their own field mapping, triggered from a workflow action, a button on the record, or automatically when the record changes. One codebase with the CRM side and the contact-centre side both behind provider interfaces, so a second CRM or a second platform is an implementation rather than a fork.",
      "engineeringNote": "A CRM app cannot hold a secret. It is configuration, interface extensions running in the vendor's sandbox, and HTTP callbacks the vendor posts to, and the CRM never talks to the contact-centre platform directly. This backend is the part that can be trusted with credentials: it brokers the OAuth, holds each customer's platform credentials encrypted, receives the callbacks and makes the calls. Getting that boundary right was the design decision."
    },
    {
      "id": "complaints-platform",
      "url": null,
      "name": "May reklamo",
      "stack": [
        "Next.js",
        "TypeScript",
        "Postgres",
        "Prisma",
        "Vercel Blob",
        "TipTap"
      ],
      "proves": "A product shipped end to end",
      "runnable": false,
      "description": "Public complaint platform for Philippine brands, government offices and public authorities, in English and Tagalog. Complaints and replies are written in a rich-text editor, supporting files are attached as screenshots or documents, and sign-in is with Google. Built and run outside work, on my own.",
      "engineeringNote": "Bilingual throughout rather than translated at the edges, because a complaint written in Tagalog has to read as the primary version and not as a secondary copy of an English one."
    },
    {
      "id": "recording-export",
      "url": null,
      "name": "Call search and bulk recording export",
      "stack": [
        "Next.js",
        "TypeScript",
        "Postgres",
        "OAuth2 + PKCE",
        "SFTP"
      ],
      "proves": "Multi-tenant product delivery",
      "runnable": false,
      "description": "Multi-tenant tool for finding calls with the full filter set an operations team actually uses, then downloading the recordings — one at a time or an entire result set — or delivering them to an FTP, FTPS or SFTP target. Any tenant onboards itself: type the tenant address and the branding switches to match; sign in with the tenant's own single sign-on, then add your own API credentials.",
      "engineeringNote": "Nobody's credentials are shared and none are held centrally. Each person brings their own, so what they can see is exactly what their credential allows, and there is no account in the middle that would quietly hold more access than the person using it. Sign-in is the tenant's own OAuth authorization code flow with PKCE, so the session key never reaches the browser."
    },
    {
      "id": "softphone-shell",
      "url": null,
      "name": "Softphone shell for Android",
      "stack": [
        "Flutter",
        "Dart",
        "Android",
        "WebView",
        "WebRTC"
      ],
      "proves": "Native and web integration",
      "runnable": false,
      "description": "Android application that hosts the browser softphone agents already use, so a phone can be the working device. The call session stays alive in the background, the microphone is wired through, incoming calls raise native notifications, and dialling a number from another app hands off into the softphone.",
      "engineeringNote": "The shell implements no telephony at all. Anything that would need a new native release every time the web softphone changes belongs in the web app, so the native side stays a policy-driven host and call events cross one documented message bridge."
    },
    {
      "id": "demo-builder",
      "url": null,
      "name": "Demo builder",
      "stack": [
        "Next.js",
        "TypeScript",
        "Postgres",
        "NextAuth"
      ],
      "proves": "Pre-sales tooling",
      "runnable": false,
      "description": "Tool for showing a click-to-connect feature in context. A partner names the page they want it on; the tool takes a static copy of that public homepage, injects the script, and publishes it under a demo URL with a banner linking back to the original site, so a conversation can happen over the partner's own page instead of a generic sandbox.",
      "engineeringNote": "Only public homepages are copied and every published page carries the banner and the link back, so a demo cannot be mistaken for the real site."
    },
    {
      "id": "test-platform",
      "url": null,
      "name": "Browser test platform",
      "stack": [
        "Next.js",
        "Playwright",
        "Postgres",
        "Google OAuth",
        "Server-Sent Events"
      ],
      "proves": "Test automation",
      "runnable": false,
      "description": "Test platform for an ordering integration. Scenarios are stored and edited centrally rather than checked in as scripts, run in real browsers on demand, watched live while they run, and their artefacts filed automatically. Access is by role, and a new account has to be approved before it can run anything.",
      "engineeringNote": "Run output is streamed to whoever is watching, and each run keeps its own artefacts, so a failure stays diagnosable after the fact instead of only being reproducible."
    },
    {
      "id": "apiexplorer",
      "url": null,
      "name": "API Explorer",
      "stack": [
        "TypeScript",
        "Chrome MV3",
        "DevTools protocol"
      ],
      "proves": "Reverse engineering, as a tool",
      "runnable": false,
      "description": "Browser extension that watches the requests a web application makes while you use it and turns them into a searchable collection: every endpoint, its payloads and its headers, with any of them replayable. Published on the Chrome Web Store. It can hand a captured endpoint to an AI provider for analysis, using a key you supply yourself.",
      "engineeringNote": "This is the method I use, turned into a tool: rather than reading a system's documentation and hoping it is current, watch what it actually does and keep the record. The AI step takes your own key on purpose — a developer tool that captures live traffic has no business also shipping a service that sees it."
    },
    {
      "id": "workflow-as-code",
      "url": null,
      "name": "Workflow-as-code toolkit",
      "stack": [
        "TypeScript",
        "Node.js",
        "n8n REST API"
      ],
      "proves": "Infrastructure as code",
      "runnable": false,
      "description": "Command-line tooling for the automation platform, so workflows are created, listed, renamed, audited and cleaned up from a script instead of by hand in the editor. Executions can be pulled back down for inspection when something failed overnight.",
      "engineeringNote": "140 workflows is past the point where the editor is the right interface. Renaming them to a convention, finding the archived ones and reading an execution's actual payload are all things you want to do to the whole set at once, which means the platform's API rather than its UI."
    },
    {
      "id": "oncall",
      "url": null,
      "name": "On-call schedule and alerts",
      "stack": [
        "Next.js",
        "TypeScript",
        "OAuth2 + PKCE",
        "Opsgenie API"
      ],
      "proves": "Operations tooling",
      "runnable": false,
      "description": "Application that puts the on-call rota and the open alerts behind the same sign-in the platform already uses, so whoever is on shift can see who is on call and what is firing without a second account and a second tool.",
      "engineeringNote": "Sign-in is the platform's own OAuth authorization code flow with PKCE, so no separate credential is created for the tool and access follows the account that already exists."
    },
    {
      "id": "flow-automation",
      "url": null,
      "name": "Call flow documentation and build automation",
      "stack": [
        "Node.js",
        "JSON Schema",
        "Markdown"
      ],
      "proves": "Configuration as code",
      "runnable": false,
      "description": "A written reference for every one of the 52 step types a call flow can contain — what each does, which fields it requires and which are optional — and scripts that build and export flows against it instead of clicking them together in the console.",
      "engineeringNote": "The field list came from working through each step type deliberately rather than from documentation, because a step that silently accepts a missing optional field is the kind of thing that only shows up in production. Once the reference existed, building flows from it was the easy part."
    },
    {
      "id": "agent-bridges",
      "url": null,
      "name": "Model Context Tool Inspector",
      "stack": [
        "TypeScript",
        "Chrome MV3",
        "WebMCP"
      ],
      "proves": "Agent tooling at the edge of the platform",
      "runnable": false,
      "description": "Browser extension for inspecting, monitoring and running the tools a page exposes to an agent through Chrome's experimental in-page tool API. Published on the Chrome Web Store. It needs a flag turned on because the API it targets is not shipped yet.",
      "engineeringNote": "Built against a browser API still behind a flag, which means the interface can move under it. That is the reason for building it: when this becomes the way pages talk to agents, the useful thing to have is the tool that shows you what a page is actually offering."
    },
    {
      "id": "n8n",
      "url": null,
      "name": "Self-hosted automation platform",
      "stack": [
        "n8n",
        "Docker Compose",
        "Postgres"
      ],
      "proves": "Workflow automation",
      "runnable": false,
      "description": "Two n8n instances, development and production, carrying 140 workflows with 62 running: bridges between the contact-centre platform and CRMs, scheduled reconciliation, warehouse reporting, and 106 webhook endpoints other systems call into.",
      "engineeringNote": "272 of the 929 nodes are hand-written code, which is the honest measure of this platform's limit: the triggers, the branching and the scheduling are worth having, and the shaping in between usually has no node that does it. Development and production are separate instances so a half-finished flow cannot answer a live webhook."
    },
    {
      "id": "raglab",
      "url": null,
      "name": "RAG Lab",
      "stack": [
        "TypeScript",
        "Next.js",
        "KaTeX"
      ],
      "proves": "Explaining a system by building it",
      "runnable": false,
      "description": "Teaching tool that walks through a retrieval pipeline one stage at a time — ingestion, chunking, embeddings, sparse index, retrieval, reranking, context packing, generation, validation — and puts BM25, vector, hybrid and hybrid-with-reranker side by side so the difference is visible. Explanations come in a beginner and a technical register.",
      "engineeringNote": "The embeddings and scores are deterministic mocks and the tool says so on the page. A teaching simulator that quietly used real model output would be unrepeatable between two people looking at it, and someone would eventually cite its numbers as a benchmark."
    },
    {
      "id": "vcard",
      "url": null,
      "name": "Digital business card",
      "stack": [
        "HTML",
        "CSS",
        "JavaScript"
      ],
      "proves": "Front-end delivery",
      "runnable": false,
      "description": "A single page that hands over contact details, with a QR code for the certification list. Written by hand with no framework and no build step.",
      "engineeringNote": "Three files served as they are. Anything that needs a build to show a phone number is over-built."
    }
  ],
  "domains": [
    "CCaaS / VoIP",
    "SaaS platforms",
    "CRM / ERP",
    "Zoho CRM",
    "HubSpot",
    "REST APIs",
    "SQL",
    "n8n",
    "MCP / WebMCP",
    "Google Apps Script",
    "JIRA",
    "Selenium",
    "Python",
    "SAP",
    "Power Platform",
    "Cursor",
    "Vercel",
    "HTML / CSS / JS",
    "BigQuery",
    "Chrome extensions (MV3)",
    "Flutter",
    "Docker"
  ],
  "profile": {
    "name": "Mustafa DOGAN",
    "email": "mail@mdogan.com",
    "phone": "+63 960 449 7680",
    "photo": "/mustafa-dogan.jpg",
    "title": "Technical Account Manager",
    "summary": "Technical Account Manager at Call Center Studio in Manila. I am the technical point of contact for client stakeholders and the escalation point into product and engineering on a SaaS contact-centre platform. I came to the role through support and business analysis on the same platform, so I can work a problem from the ticket detail to the client conversation, and build the integrations and internal tooling that remove the manual work around it. My agent-driven reporting product took second place at our AI hackathon in July 2026 and is now in production.",
    "website": "https://mddogan.com",
    "headline": "Technical Account Manager · CCaaS platforms · API and system integration",
    "linkedin": {
      "url": "https://www.linkedin.com/in/mustafadogann",
      "label": "linkedin.com/in/mustafadogann"
    },
    "location": {
      "city": "Metro Manila",
      "country": "Philippines",
      "countryCode": "PH"
    },
    "pronouns": "he/him",
    "linkedinHeadline": "Technical Account Manager | AI Systems & Automation | RAG Pipelines • API Integrations • MCP"
  },
  "sources": [
    "LinkedIn profile, pulled 11 August 2026 (linkedin.com/in/mustafadogann)",
    "CV PDF — Mustafa DOGAN, Technical Account Manager (30 July 2026)",
    "Vercel team account, counted via the Vercel API, 11 August 2026",
    "76 local project directories, each read individually, 11 August 2026",
    "n8n REST API on both instances, paginated, measured 11 August 2026: 140 workflows, 62 active, 929 nodes",
    "Calendar, Gmail and meeting records, 11 Feb – 11 Aug 2026: 10 scheduling timezones over 240 events"
  ],
  "version": 1,
  "evidence": [
    {
      "id": "tam-ccs",
      "end": null,
      "body": "Technical bridge between internal teams and external stakeholders, and the escalation point between clients, product and engineering on complex implementation work. Hands-on delivery for clients in the Philippines. I design and build AI-powered internal and client-facing applications, integrate APIs and SQL systems, and build AI-orchestrated workflows with n8n and MCP/WebMCP.",
      "kind": "experience",
      "tags": [
        "ccaas",
        "enterprise",
        "escalation",
        "account",
        "stakeholder",
        "saas",
        "api",
        "automation",
        "ai",
        "mcp",
        "sql"
      ],
      "start": "2025-08",
      "title": "Technical Account Manager",
      "period": "Aug 2025 - present",
      "proofs": [
        "n8n"
      ],
      "weight": 3,
      "location": "Manila, Philippines · on-site",
      "highlights": [
        "Escalation point between clients, product and engineering",
        "Internal and client-facing applications, built with Cursor and Vercel",
        "API and SQL integrations between the platform and customer systems",
        "AI-orchestrated workflows using n8n and MCP/WebMCP"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "ba-ccs",
      "end": "2025-08",
      "body": "Turned what the business asked for into technical requirements, and explained back what the platform could and could not do, for teams across the company. Administered CRM and ERP systems, ran delivery in JIRA from intake to completion, and built custom JIRA reports. Automated recurring tasks with Google Apps Script, and mediated between technical teams and clients to shorten resolution times.",
      "kind": "experience",
      "tags": [
        "analysis",
        "requirements",
        "crm",
        "erp",
        "jira",
        "automation",
        "reporting",
        "data",
        "sql",
        "hubspot",
        "zoho"
      ],
      "start": "2024-02",
      "title": "Business Analyst",
      "period": "Feb 2024 - Aug 2025",
      "proofs": [],
      "weight": 3,
      "location": "Manila, Philippines · on-site",
      "highlights": [
        "Requirements translation between technical and non-technical teams",
        "CRM and ERP administration",
        "Delivery tracking and custom reporting in JIRA",
        "Task automation with Google Apps Script"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "tss-ccs",
      "end": "2024-02",
      "body": "Helpdesk support for a SaaS web-based contact-centre platform with an international customer base. Resolved application issues over email, phone and chat, analysed recurring problems to feed product improvement, and wrote technical documentation and guides so users could resolve common issues themselves.",
      "kind": "experience",
      "tags": [
        "support",
        "ccaas",
        "saas",
        "troubleshooting",
        "documentation",
        "escalation"
      ],
      "start": "2022-06",
      "title": "Technical Support Specialist",
      "period": "Jun 2022 - Feb 2024",
      "proofs": [],
      "weight": 2,
      "location": "Istanbul, Türkiye · remote",
      "highlights": [
        "Application support over email, phone and chat",
        "Recurring issues tracked back into product improvement",
        "Technical documentation and self-service guides"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "tss-alotech",
      "end": "2024-02",
      "body": "Helpdesk support for AloTech's SaaS contact-centre application over email, phone and chat: diagnosing application problems, producing fixes and workarounds, and writing documentation so users could resolve issues without raising a ticket.",
      "kind": "experience",
      "note": "AloTech and Call Center Studio are part of the same platform group, which is why LinkedIn lists both roles over the same period.",
      "tags": [
        "support",
        "ccaas",
        "saas",
        "troubleshooting",
        "documentation"
      ],
      "start": "2022-06",
      "title": "Technical Support Specialist",
      "period": "Jun 2022 - Feb 2024",
      "proofs": [],
      "weight": 2,
      "location": "Istanbul, Türkiye",
      "highlights": [
        "Application-level diagnosis and resolution",
        "Documentation aimed at reducing repeat tickets"
      ],
      "organization": "AloTech"
    },
    {
      "id": "intern-ktu",
      "end": "2022-04",
      "body": "Organised and ran career development events for students, from planning through to delivery. Built software that generated and distributed participation certificates automatically, and reported on programme outcomes. Assistant manager for DOKKAF, the East Black Sea Career Fair.",
      "kind": "experience",
      "tags": [
        "automation",
        "php",
        "training",
        "reporting"
      ],
      "start": "2021-12",
      "title": "Project Intern",
      "period": "Dec 2021 - Apr 2022",
      "proofs": [],
      "weight": 1,
      "location": "Trabzon, Türkiye",
      "highlights": [
        "Career development events, planned and delivered",
        "Certificate generation and distribution automated in software",
        "Assistant manager, DOKKAF career fair"
      ],
      "organization": "KTÜ Career Development Centre"
    },
    {
      "id": "trainer-bilisim",
      "end": "2021-08",
      "body": "Designed and delivered corporate training on CRM, SAP, ERP and other enterprise information systems, and set assessments to measure what participants retained. Also ran personal development sessions for managers and team leads.",
      "kind": "experience",
      "tags": [
        "training",
        "sap",
        "erp",
        "crm"
      ],
      "start": "2021-07",
      "title": "Corporate Trainer",
      "period": "Jul - Aug 2021 · seasonal",
      "proofs": [],
      "weight": 1,
      "location": "Türkiye",
      "highlights": [
        "Training on CRM, SAP and ERP systems",
        "Assessments used to measure retention",
        "Leadership sessions for managers"
      ],
      "organization": "Bilişim Eğitim Merkezi"
    },
    {
      "id": "ste-techops",
      "end": "2021-07",
      "body": "Outsourced software testing for client companies. Wrote and ran test cases for web and mobile applications, automated regression runs with Selenium, and returned findings to development teams. Re-tested before release to confirm fixes held.",
      "kind": "experience",
      "tags": [
        "qa",
        "selenium",
        "testing",
        "automation",
        "regression"
      ],
      "start": "2021-03",
      "title": "Software Test Engineer",
      "period": "Mar - Jul 2021",
      "proofs": [],
      "weight": 2,
      "location": "Istanbul, Türkiye",
      "highlights": [
        "Test cases for web and mobile applications",
        "Regression automation with Selenium",
        "Findings returned to development teams, then re-tested"
      ],
      "organization": "TechOps Center"
    },
    {
      "id": "ops-trainer-tempo",
      "end": "2021-02",
      "body": "Trained customer service representatives on application use and case-handling technique, and developed the training material they worked from.",
      "kind": "experience",
      "tags": [
        "training",
        "support"
      ],
      "start": "2020-12",
      "title": "Operational Support and Trainer",
      "period": "Dec 2020 - Feb 2021",
      "proofs": [],
      "weight": 1,
      "location": "Şanlıurfa, Türkiye",
      "highlights": [
        "Application and case-handling training for representatives",
        "Training material developed in-house"
      ],
      "organization": "Tempo Çağrı Merkezi"
    },
    {
      "id": "ops-tempo",
      "end": "2020-11",
      "body": "Guided customer service representatives through difficult cases and coordinated the team so work was distributed evenly across the shift.",
      "kind": "experience",
      "tags": [
        "support"
      ],
      "start": "2020-09",
      "title": "Operational Support",
      "period": "Sep - Nov 2020",
      "proofs": [],
      "weight": 1,
      "location": "Şanlıurfa, Türkiye",
      "highlights": [
        "Case guidance for representatives",
        "Team coordination across shifts"
      ],
      "organization": "Tempo Çağrı Merkezi"
    },
    {
      "id": "crs-tempo",
      "end": "2020-08",
      "body": "Handled inbound customer issues by phone: understanding the problem, resolving it where possible, and escalating it with the detail the next team needed.",
      "kind": "experience",
      "tags": [
        "support"
      ],
      "start": "2020-03",
      "title": "Customer Relations Specialist",
      "period": "Mar - Aug 2020",
      "proofs": [],
      "weight": 1,
      "location": "Şanlıurfa, Türkiye",
      "highlights": [
        "Inbound issue resolution by phone"
      ],
      "organization": "Tempo Çağrı Merkezi"
    },
    {
      "id": "msc-imperial",
      "end": "2025-09",
      "body": "Part-time MSc taken alongside full-time work, covering the statistical, mathematical and computational foundations of machine learning, with collaborative projects across the cohort.",
      "kind": "education",
      "tags": [
        "ml",
        "ai",
        "data",
        "python",
        "statistics"
      ],
      "start": "2023-10",
      "title": "MSc Machine Learning & Data Science",
      "period": "Oct 2023 - Sep 2025",
      "proofs": [],
      "weight": 3,
      "location": "Merit",
      "highlights": [
        "Statistical and computational foundations of machine learning",
        "Completed part-time alongside full-time work"
      ],
      "organization": "Imperial College London"
    },
    {
      "id": "bsc-ktu",
      "end": "2023-06",
      "body": "Graduated with honours. Worked at the university's Career Development Centre alongside the degree, building internal tools including a bulk email system and a dynamic QR code application.",
      "kind": "education",
      "tags": [
        "mis",
        "php",
        "web",
        "automation"
      ],
      "start": "2019-09",
      "title": "BSc Management Information Systems",
      "period": "Sep 2019 - Jun 2023",
      "proofs": [],
      "weight": 1,
      "location": "Honours",
      "highlights": [
        "Graduated with honours",
        "Internal tools built for the Career Development Centre"
      ],
      "organization": "Karadeniz Technical University"
    },
    {
      "id": "account-ownership",
      "end": null,
      "body": "I am the technical point of contact for client stakeholders and the escalation route into product and engineering. That covers scoping what a tenant needs, turning it into something engineering can act on, and staying on it through delivery and adoption. Four years on the same platform across support, business analysis and account management means I can work a problem from the ticket detail up to the stakeholder conversation. Enablement is part of it rather than a handover: I have run a two-day enablement and certification programme for an enterprise customer's contact-centre organisation, around 130 people, provisioning their accounts in bulk before each session. I travel to a customer's site when a multi-vendor cutover needs someone in the room.",
      "kind": "capability",
      "tags": [
        "ccaas",
        "enterprise",
        "escalation",
        "account",
        "stakeholder",
        "analysis",
        "support"
      ],
      "start": "2025-08",
      "title": "Client technical ownership",
      "period": "2025 - present",
      "proofs": [],
      "weight": 3,
      "location": "",
      "highlights": [
        "Technical point of contact and escalation route for enterprise tenants",
        "Requirements turned into specifications engineering can act on",
        "Delivery and adoption followed through rather than handed off",
        "A two-day enablement and certification programme for around 130 of a customer's staff"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "platform-automation",
      "end": null,
      "body": "Around 20 projects do administration through a platform's own interfaces instead of its console: bulk configuration rollouts, roster and extension assignment, scheduled reconciliation. 140 n8n workflows across development and production, 62 of them running, 929 nodes in total with 272 custom code nodes and 106 webhook endpoints that other systems call. Every bulk action ships with its rails: preview, drift detection, run caps, audit rows and a rollback path.",
      "kind": "capability",
      "tags": [
        "automation",
        "n8n",
        "webhook",
        "api",
        "integration",
        "sql",
        "data"
      ],
      "start": "2024-02",
      "title": "Platform automation and bulk operations",
      "period": "2024 - present",
      "proofs": [
        "n8n",
        "dialer-rules"
      ],
      "weight": 3,
      "location": "",
      "highlights": [
        "140 workflows across development and production, 62 active",
        "272 custom code nodes and 106 webhook endpoints rather than stock blocks",
        "Preview, drift detection, run caps and rollback on every bulk operation",
        "Production mirrored to disk so configuration drift can be diffed"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "integration",
      "end": null,
      "body": "Nine projects sit between two systems that have no integration path: a CRM and a contact-centre platform, a warehouse and an operations console. The recurring shape is a broker that owns OAuth install and refresh, per-tenant encrypted credentials, and a field-mapping layer, structured behind provider interfaces so a second CRM or a second platform arrives as an adapter rather than a rewrite. The same period covers CRM and ERP administration as a business analyst, across HubSpot, Zoho and SAP.",
      "kind": "capability",
      "tags": [
        "api",
        "rest",
        "integration",
        "sql",
        "crm",
        "erp",
        "hubspot",
        "zoho",
        "data",
        "reporting"
      ],
      "start": "2022-06",
      "title": "Integration middleware",
      "period": "2022 - present",
      "proofs": [],
      "weight": 3,
      "location": "",
      "highlights": [
        "OAuth custody and per-tenant encrypted credentials",
        "Field-mapping engine behind provider interfaces, so a second integration is an adapter",
        "CRM and ERP administration across HubSpot, Zoho and SAP"
      ],
      "organization": "Across roles"
    },
    {
      "id": "interface-recovery",
      "end": null,
      "body": "14 captured traffic sessions sit in this portfolio, each one the start of the same method: record the live traffic, check it against whatever specification exists, write down where the two diverge, and encode the verified contract as a module the dependent code cites. Where a system accepts unknown parameters silently, a parameter counts as supported only once a deliberately non-matching value is shown to shrink the result count, so the map is probed rather than assumed. Each of these paths sits behind a provider interface, so a sanctioned API can replace it later without touching the callers.",
      "kind": "capability",
      "tags": [
        "api",
        "integration",
        "automation",
        "qa",
        "analysis"
      ],
      "start": "2023-01",
      "title": "Recovering an undocumented interface",
      "period": "2023 - present",
      "proofs": [
        "dialer-rules",
        "apiexplorer"
      ],
      "weight": 3,
      "location": "",
      "highlights": [
        "14 traffic captures, each turned into a written contract the code cites",
        "A parameter counts as supported only when a non-matching value provably shrinks the result",
        "A provider interface on every unofficial path, so it can be swapped for a sanctioned one"
      ],
      "organization": "Across roles"
    },
    {
      "id": "mobile",
      "end": null,
      "body": "Two Flutter applications shipped for phones, both built around an existing web product rather than replacing it. One is a full client for the reporting product on iOS and Android, matching the web app screen for screen so there is one set of behaviour to support instead of two. The other hosts the browser softphone on Android so an agent can work from a phone, keeping the call session alive in the background and wiring the microphone and notifications through to the native side.",
      "kind": "capability",
      "tags": [
        "mobile",
        "integration",
        "product",
        "api"
      ],
      "start": "2026-01",
      "title": "Mobile delivery",
      "period": "2026",
      "proofs": [
        "report-studio-mobile",
        "softphone-shell"
      ],
      "weight": 2,
      "location": "",
      "highlights": [
        "Flutter for iOS and Android, Material 3, light and dark",
        "Platform sign-in reused inside the app rather than a second authentication path",
        "Deep-linkable routes matching the web app, Turkish and English"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "reporting",
      "end": null,
      "body": "11 projects do the same job at different scales: take a number somebody maintains by hand and make it trustworthy. Roster reconciliation between systems, order-accuracy verification against a live pricing service, operational reporting over a warehouse. Where a model helps, the deterministic layer keeps control: a generated query does not execute until it passes a cost estimate against configured limits, and safety decisions come from rule-based gates.",
      "kind": "capability",
      "tags": [
        "data",
        "reporting",
        "sql",
        "analysis",
        "automation",
        "ai"
      ],
      "start": "2024-02",
      "title": "Reporting and reconciliation",
      "period": "2024 - present",
      "proofs": [],
      "weight": 2,
      "location": "",
      "highlights": [
        "Reconciliation between systems that disagree, with the differences reported",
        "Warehouse-backed operational reporting and dashboards",
        "Cost estimation enforced before any generated query executes"
      ],
      "organization": "Across roles"
    },
    {
      "id": "testing",
      "end": null,
      "body": "Browser tests for an ordering integration are stored and edited centrally rather than checked in as scripts, run in real browsers on demand, watched while they run, and their artefacts filed per run; access is by role with an approval step before a new account can run anything. Captured requests have also been replayed as load, so endpoints were measured under repetition rather than proven to work once, with the results kept alongside the capture they came from.",
      "kind": "capability",
      "tags": [
        "qa",
        "automation",
        "api",
        "analysis"
      ],
      "start": "2025-06",
      "title": "Test automation and load testing",
      "period": "2025 - present",
      "proofs": [
        "test-platform"
      ],
      "weight": 2,
      "location": "",
      "highlights": [
        "Playwright scenarios managed as data, not as checked-in scripts",
        "Run output streamed live, artefacts filed per run",
        "Captured requests replayed as load, with the measurements kept"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "distributed",
      "end": null,
      "body": "I am based in Manila and the engineering team is in Türkiye, so the working day is built around an overlap rather than an office. Over one recent six-week stretch my calendar carried 10 distinct scheduling timezones, and more meetings were set in Istanbul time than in my own — 121 against 99. Just over a third of them started at 18:00 or later where I sit. The counterparts in that period were in the Philippines, Türkiye, Pakistan, the United Kingdom, the United States, Norway, Germany, Malaysia, India, Taiwan, Brunei and China. Internal sessions run in Turkish and customer sessions in English, often in the same week.",
      "kind": "capability",
      "tags": [
        "support",
        "analysis",
        "product"
      ],
      "start": "2024-09",
      "title": "Working across timezones",
      "period": "2024 - present",
      "proofs": [],
      "weight": 2,
      "location": "",
      "highlights": [
        "10 scheduling timezones in six weeks, from Los Angeles to Istanbul",
        "More meetings on the engineering team's clock than on my own",
        "Turkish internally, English with customers, in the same week"
      ],
      "organization": "Call Center Studio"
    },
    {
      "id": "building",
      "end": null,
      "body": "27 applications in production across 416 deployments, from 49 private repositories: TypeScript and Next.js on the web, Flutter and Kotlin for mobile, Python for data work. Eight Manifest V3 Chrome extensions, one published to the Chrome Web Store, including a network-capture developer tool and typed tool bridges built on the Model Context Protocol (MCP and WebMCP) that let a model drive a web application with no automation API. Retrieval-augmented generation is used here to ground answers in a known corpus.",
      "kind": "capability",
      "tags": [
        "agent",
        "ai",
        "api",
        "automation",
        "integration",
        "llm",
        "mcp",
        "rag",
        "retrieval",
        "web"
      ],
      "start": "2023-01",
      "title": "Applications and browser tooling",
      "period": "2023 - present",
      "proofs": [
        "apiexplorer"
      ],
      "weight": 2,
      "location": "",
      "highlights": [
        "27 applications in production across 416 deployments",
        "49 repositories across TypeScript, Flutter, Kotlin and Python",
        "Eight MV3 Chrome extensions, one published to the Web Store"
      ],
      "organization": "Alongside the role"
    }
  ],
  "howIWork": [
    "I establish what a system actually does before changing it, and I write that down. Undocumented behaviour becomes a named contract in the repository that the dependent code cites.",
    "I automate against a platform's own interfaces rather than clicking through its console. Deploys are scripts, a fix to a live flow is an idempotent patch, and production is mirrored to disk so drift can be diffed.",
    "I build the safety rail before the bulk action. Mandatory preview, a drift check that halts if the target set moved more than 10 per cent since preview, hard run caps, per-record audit rows and a matching rollback script.",
    "I treat rules and scenarios as data so one executor serves many cases, rather than writing a script per case.",
    "Where a language model is involved, the deterministic layer stays in charge. A generated query does not run until it passes a cost estimate, and safety verdicts come from rule-based gates rather than from the model.",
    "I choose the read-only variant when the mutating one would be easier. An accuracy audit stops before it places anything.",
    "I write the memo that argues why the obvious approach will not work, before building the one that does.",
    "I record negative results. Where a decode was incomplete or a run produced untrustworthy output, that is written down next to the code.",
    "I build an escape hatch out of any reverse-engineered path, so a sanctioned API can replace it later without touching the callers.",
    "I make runs reproducible and auditable: query text, row counts, bytes billed, prompt and model versions kept for later inspection."
  ],
  "linkedin": {
    "note": "Experience, dates and the certification list were taken from the LinkedIn profile. Role descriptions are condensed from the wording on the profile; nothing has been added that is not stated there.",
    "syncedAt": "2026-08-11"
  },
  "languages": [
    {
      "code": "tr",
      "name": "Turkish",
      "level": "Native"
    },
    {
      "code": "en",
      "name": "English",
      "level": "Professional"
    },
    {
      "code": "ku",
      "name": "Kurdish",
      "level": "Professional"
    },
    {
      "code": "es",
      "name": "Spanish",
      "level": "Elementary"
    },
    {
      "code": "tl",
      "name": "Tagalog",
      "level": "Elementary"
    }
  ],
  "skillTags": [
    "ccaas",
    "api",
    "ai",
    "automation",
    "qa",
    "crm",
    "erp",
    "sql",
    "analysis",
    "support"
  ],
  "updatedAt": "2026-08-11",
  "highlights": [
    {
      "label": "at Call Center Studio",
      "value": "4 yrs",
      "detail": "Support, business analysis, then account management"
    },
    {
      "label": "automations built",
      "value": "140",
      "detail": "62 running across two n8n environments"
    },
    {
      "label": "countries worked with",
      "value": "12",
      "detail": "10 scheduling timezones in one six-week stretch"
    },
    {
      "label": "certifications",
      "value": "158",
      "detail": "Listed on LinkedIn with credential IDs"
    }
  ],
  "roleLenses": [
    {
      "id": "technical-account-manager",
      "gaps": [
        "No revenue, retention or renewal figures. Commercial outcomes were owned by sales in my organisation.",
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No experience of the Australian market. My clients have been in Türkiye, the Philippines and remote across EMEA and APAC."
      ],
      "label": "Technical Account Manager",
      "learnable": [
        {
          "need": "A large portfolio rather than a few accounts in depth",
          "nearest": "I run a small number of accounts deeply. Breadth is a matter of cadence and triage rather than a different skill, and the support years were high-volume queue work."
        },
        {
          "need": "Renewal conversations and commercial motion",
          "nearest": "I have been in those rooms on the technical side and know what makes a renewal difficult. Carrying the number myself is the part that would be new."
        }
      ],
      "requirements": [
        {
          "need": "Own the technical relationship with named clients",
          "evidence": "account-ownership"
        },
        {
          "need": "Be the escalation point into product and engineering",
          "evidence": "tam-ccs"
        },
        {
          "need": "Turn what a client asks for into a specification",
          "evidence": "ba-ccs"
        },
        {
          "need": "Hold the platform knowledge to answer without relaying",
          "evidence": "tss-ccs"
        },
        {
          "need": "Remove the manual work around the account",
          "evidence": "platform-automation"
        }
      ]
    },
    {
      "id": "customer-success-lead",
      "gaps": [
        "No retention, expansion or NPS figures I can put a number to.",
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No experience of the Australian market."
      ],
      "label": "Customer Success Lead",
      "learnable": [
        {
          "need": "Leading a team of CSMs",
          "nearest": "I have trained corporate groups and run operational enablement for contact-centre teams, so setting standards and teaching to them is on record. Owning people's performance is not."
        },
        {
          "need": "Health scoring and churn models",
          "nearest": "I build the reporting these run on, including a product that turns a request into a governed warehouse query. Choosing what the score should be is the new part."
        },
        {
          "need": "A formal QBR and success-plan cadence",
          "nearest": "The material exists in what I already produce for accounts; what I have not done is run it as a scheduled programme across a portfolio."
        }
      ],
      "requirements": [
        {
          "need": "Own adoption and outcomes across a client base",
          "evidence": "account-ownership"
        },
        {
          "need": "Run the escalation path when delivery is at risk",
          "evidence": "tam-ccs"
        },
        {
          "need": "Build the enablement so clients need fewer escalations",
          "evidence": "trainer-bilisim"
        },
        {
          "need": "Report on health with figures rather than impressions",
          "evidence": "reporting"
        },
        {
          "need": "Work across timezones with teams in other countries",
          "evidence": "distributed"
        }
      ]
    },
    {
      "id": "automation-lead",
      "gaps": [
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No budget or P&L ownership. I have not held a cost centre, forecast a spend or signed off a purchase.",
        "Infrastructure-level operations — Kubernetes, SRE practice, Terraform — are not my area. I work at the platform and integration layer.",
        "The work at my employer is in private repositories, so there is no public commit history to review for it."
      ],
      "label": "Automation and Platform Lead",
      "learnable": [
        {
          "need": "Leading a team of automation engineers",
          "nearest": "The standards are already written down and enforced — preview, drift detection, run caps, audit rows, a rollback path, separate development and production instances. Applying them through other people is the step up."
        },
        {
          "need": "On-call ownership of always-on services",
          "nearest": "My workloads are scheduled functions and webhook endpoints with retries and audit trails, not services with a rotation. The failure modes I have handled are missed windows and partial batches, not paging."
        },
        {
          "need": "Platform cost governance at scale",
          "nearest": "I built a cost gate into a reporting product so no generated query runs before a dry-run estimate clears a limit. Holding a platform budget is different from refusing one expensive query."
        }
      ],
      "requirements": [
        {
          "need": "Own an automation platform and its standards",
          "evidence": "platform-automation"
        },
        {
          "need": "Design integrations between systems you do not own",
          "evidence": "integration"
        },
        {
          "need": "Recover an interface nobody documented",
          "evidence": "interface-recovery"
        },
        {
          "need": "Build the tooling the team works through",
          "evidence": "building"
        },
        {
          "need": "Keep automation testable rather than hopeful",
          "evidence": "testing"
        }
      ]
    },
    {
      "id": "delivery-manager",
      "gaps": [
        "No PMP, PRINCE2 or equivalent.",
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No budget or P&L ownership. I have not held a cost centre, forecast a spend or signed off a purchase.",
        "Programme-level governance inside a PMO is not something I have owned."
      ],
      "label": "Technical Delivery Manager",
      "learnable": [
        {
          "need": "Running a delivery team and its plan",
          "nearest": "I have delivered end to end repeatedly — 67 ordered migrations on one product, a mobile client matching a web app screen for screen — so I know what the plan has to account for. Coordinating other people to it is the step up."
        },
        {
          "need": "Formal project frameworks and their vocabulary",
          "nearest": "The discipline is there in migrations, changelogs and test suites; the certificate and the PMO vocabulary are not. My business analysis credentials are vendor courses, not IIBA or PMI."
        },
        {
          "need": "Managing a third-party delivery partner",
          "nearest": "I have built the tooling partners use and worked against interfaces they own, but I have not held a supplier to a contract."
        }
      ],
      "requirements": [
        {
          "need": "Deliver integrations into systems already in production",
          "evidence": "integration"
        },
        {
          "need": "Take a requirement through to a working release",
          "evidence": "ba-ccs"
        },
        {
          "need": "Ship to phones as well as the web",
          "evidence": "mobile"
        },
        {
          "need": "Keep a release honest with tests before it goes out",
          "evidence": "testing"
        },
        {
          "need": "Stay the technical contact through the delivery",
          "evidence": "account-ownership"
        }
      ]
    },
    {
      "id": "product-manager",
      "gaps": [
        "No product management job title, though the ownership is real.",
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No pricing or revenue responsibility.",
        "Limited exposure to regulated finance or healthcare product constraints."
      ],
      "label": "Product Manager, Platform and Integrations",
      "learnable": [
        {
          "need": "Pricing, packaging and commercial modelling",
          "nearest": "I have built the usage tracking and cost limits a pricing decision would rest on, and I have not made the pricing decision."
        },
        {
          "need": "Research with users at sample size",
          "nearest": "My requirements come from the clients I hold and the support queue behind them, which is real signal from a narrow set. Structured research across a market is the new part."
        },
        {
          "need": "A team of product managers or a roadmap across squads",
          "nearest": "I own the roadmap for my own product, planned, built and shipped, with the backlog closed out commit by commit in my own repository. For one product and one builder."
        }
      ],
      "requirements": [
        {
          "need": "Own a product from problem to release",
          "evidence": "ba-ccs"
        },
        {
          "need": "Decide what gets built and what does not",
          "evidence": "building"
        },
        {
          "need": "Read the warehouse rather than ask for a report",
          "evidence": "reporting"
        },
        {
          "need": "Know the platform well enough to argue with engineering",
          "evidence": "tss-ccs"
        },
        {
          "need": "Take a prototype through to real users",
          "evidence": "mobile"
        }
      ]
    },
    {
      "id": "partner-enablement",
      "gaps": [
        "No channel or partner revenue figures.",
        "No line management. I have never set someone's objectives, run their review or been responsible for hiring or letting go.",
        "No experience of the Australian partner landscape."
      ],
      "label": "Partner Enablement Manager",
      "learnable": [
        {
          "need": "Owning partner revenue or a channel target",
          "nearest": "I have built the demonstration tooling a channel runs on, including a builder that puts a click-to-connect feature onto a partner's own page. The number attached to it was not mine."
        },
        {
          "need": "Running a certification programme for partners",
          "nearest": "I have written the reference for every step type in a call flow and trained corporate groups, which is the material a certification is made of. Running it as a programme with levels and assessment is not something I have done."
        },
        {
          "need": "Managing partner relationships commercially",
          "nearest": "The technical relationship is what I hold. Contracts, margin and tiering sat elsewhere."
        }
      ],
      "requirements": [
        {
          "need": "Make the product demonstrable to partners",
          "evidence": "account-ownership"
        },
        {
          "need": "Build what partners need to sell it themselves",
          "evidence": "building"
        },
        {
          "need": "Teach the technical content to a room",
          "evidence": "trainer-bilisim"
        },
        {
          "need": "Integrate with whatever the partner already runs",
          "evidence": "integration"
        },
        {
          "need": "Work across timezones with teams in other countries",
          "evidence": "distributed"
        }
      ]
    }
  ],
  "environments": [
    {
      "id": "ccaas",
      "boost": [
        "ccaas",
        "support",
        "saas"
      ],
      "label": "CCaaS / contact centre"
    },
    {
      "id": "integration",
      "boost": [
        "crm",
        "erp",
        "api",
        "integration"
      ],
      "label": "CRM + ERP integration"
    },
    {
      "id": "ai",
      "boost": [
        "ai",
        "mcp",
        "automation"
      ],
      "label": "AI / automation"
    },
    {
      "id": "qa",
      "boost": [
        "qa",
        "selenium",
        "testing"
      ],
      "label": "QA / test automation"
    }
  ],
  "certifications": {
    "note": "158 certifications are listed on LinkedIn. The entries below are the most recent, taken from the profile with their credential IDs where LinkedIn shows them; the rest remain on the LinkedIn profile rather than being duplicated here.",
    "items": [
      {
        "date": "May 2026",
        "group": "AI",
        "title": "Gemini for Developers",
        "issuer": "Google DeepMind",
        "source": "linkedin",
        "verified": true,
        "credentialId": "10APGA9A4OPT"
      },
      {
        "date": "May 2026",
        "group": "AI",
        "title": "Exploring AI with Google AI Studio",
        "issuer": "Google DeepMind",
        "source": "linkedin",
        "verified": true,
        "credentialId": "SCTZ55P5J1JS"
      },
      {
        "date": "May 2026",
        "group": "AI",
        "title": "Getting Started with Google Gemini API",
        "issuer": "Google DeepMind",
        "source": "linkedin",
        "verified": true,
        "credentialId": "I03582Z7VBMH"
      },
      {
        "date": "Apr 2026",
        "group": "Analysis",
        "title": "Optimization Methods in Business Analytics",
        "issuer": "MIT OpenCourseWare",
        "source": "linkedin",
        "verified": true
      },
      {
        "date": "Apr 2026",
        "group": "AI",
        "title": "Computational Neuroscience with Neuroblox",
        "issuer": "MIT OpenCourseWare",
        "source": "linkedin",
        "verified": true
      },
      {
        "date": "Dec 2025",
        "group": "ERP",
        "title": "Understanding the Enterprise Systems Environment",
        "issuer": "SAP",
        "source": "linkedin",
        "verified": true,
        "credentialId": "CAIEK88031MM"
      },
      {
        "date": "Dec 2025",
        "group": "ERP",
        "title": "SAP Professional Fundamentals",
        "issuer": "SAP",
        "source": "linkedin",
        "verified": true,
        "credentialId": "YA4CHNYOQ5Q5"
      },
      {
        "date": "May 2025",
        "group": "Analysis",
        "title": "Microsoft Business Analyst",
        "issuer": "Microsoft",
        "source": "linkedin",
        "verified": true,
        "credentialId": "PKL37O0PD75D"
      },
      {
        "date": "May 2025",
        "group": "Analysis",
        "title": "Power Platform in Business Analysis",
        "issuer": "Microsoft",
        "source": "linkedin",
        "verified": true,
        "credentialId": "C2KGRIB2F41N"
      },
      {
        "date": "May 2025",
        "group": "Analysis",
        "title": "Requirements Gathering in Business Analysis",
        "issuer": "Microsoft",
        "source": "linkedin",
        "verified": true,
        "credentialId": "J0TMPGMUQFF9"
      },
      {
        "date": "2025",
        "group": "Cloud",
        "title": "Azure AI Fundamentals (AI-900)",
        "issuer": "Microsoft",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2024",
        "group": "Cloud",
        "title": "Google Cloud Digital Leader",
        "issuer": "Google Cloud",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2023",
        "group": "Automation",
        "title": "Google IT Automation with Python",
        "issuer": "Google",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2023",
        "group": "API",
        "title": "Postman: REST API Testing",
        "issuer": "Postman",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2023",
        "group": "Agile",
        "title": "Scrum Master Certification",
        "issuer": "Scrum Alliance",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2023",
        "group": "Data",
        "title": "SQL Advanced",
        "issuer": "HackerRank",
        "source": "cv",
        "verified": false
      },
      {
        "date": "2022",
        "group": "QA",
        "title": "ISTQB Foundation",
        "issuer": "Turkish Testing Board",
        "source": "cv",
        "verified": false
      }
    ],
    "total": 158
  },
  "automationSamples": [
    {
      "id": "chat-ops",
      "name": "n8n operations assistant in Google Chat",
      "what": "Engineers run the automation platform by talking to it in the chat client they already have open. Ask in plain language and it lists the workflows, summarises one, reports which ones errored in the last day, explains why, and proposes a fix. Accept the fix and it patches the workflow, deploys it, activates it and offers to replay the payload that failed so you can see it pass. It also writes new workflows: it interviews you for the specification, researches the nodes it will need, and builds the flow.",
      "nodes": 47,
      "stack": [
        "Google Chat",
        "LLM planner",
        "n8n REST API",
        "Code",
        "Webhook"
      ],
      "pattern": "A planner model picks one of 10 tools rather than improvising, so every answer comes from a real call and not from the model's memory. What it refuses is deliberate: it never deletes a workflow, never prints a secret into a chat thread — credentials are referred to by name only — and works against one instance at a time. Anything slow runs on an internal webhook and posts its result back, because a chat client will not wait for a build.",
      "trigger": "Chat message, plus internal webhooks for the slow jobs"
    },
    {
      "id": "screen-pop",
      "name": "Caller context popup for the agent",
      "what": "When a call arrives, the caller's number is looked up in the CRM and the agent gets a rendered panel: who is calling, their open deals, their notes, tasks and activities, their company, their stores, and their previous calls on the platform. If the number is not a known contact it falls back to matching the account instead of showing nothing. A second endpoint lets the agent write a note straight back into the CRM from that panel.",
      "nodes": 45,
      "stack": [
        "Webhook",
        "Zoho Bigin",
        "Merge",
        "Code",
        "HTML response"
      ],
      "pattern": "Six CRM lookups and the call history run in parallel and are merged in five stages, because sequentially they would not return before the agent has to speak. The panel is built as HTML inside the workflow and returned in the response, so there is no front end to host for it. The token refresh happens in the same run rather than being cached somewhere that could go stale mid-call.",
      "trigger": "Webhook on the inbound call, answered with HTML"
    },
    {
      "id": "admin-api",
      "name": "Trial administration as a single workflow",
      "what": "The whole administrative side of a trial programme: adding and removing tenants, registering users and approving them, keeping the notification list, reading usage totals out of the warehouse, and writing an audit line for each action. Registration is not automatic — an approval email goes out, and the user is only mailed once someone has approved them. An hourly pass works out which trials are due a reminder, checks their usage against the threshold and mails whoever needs mailing, then deactivates the reminder so it cannot fire twice.",
      "nodes": 51,
      "stack": [
        "Webhook",
        "Schedule",
        "BigQuery",
        "Gmail",
        "Code",
        "Switch"
      ],
      "pattern": "One webhook and a switch carry about 20 distinct actions, which is why 30 of the 51 nodes are code. The reminder branch does not trust its own schedule: it re-checks usage against the threshold before it sends, so a tenant who became active in the meantime does not get chased.",
      "trigger": "Webhook for the actions, hourly schedule for the reminders"
    },
    {
      "id": "workflow-dashboard",
      "name": "An authenticated dashboard with no application behind it",
      "what": "A campaign dashboard that a person signs into and reads. The workflow serves the sign-in page, runs the OAuth handshake, sets the session cookie, queries the warehouse and renders the dashboard — as HTML for a browser or as JSON for anything else asking. An unauthenticated request gets a redirect or a 401 depending on what it asked for.",
      "nodes": 25,
      "stack": [
        "Webhook",
        "OAuth2",
        "Session cookie",
        "BigQuery",
        "HTML response"
      ],
      "pattern": "There is no application server, no deployment and nothing to keep alive: a workflow is the entire service, sign-in included. It branches on what the caller wants back rather than assuming a browser, which is the only reason the same three endpoints can serve a page and an API at once.",
      "trigger": "Three webhooks: the page, sign-in, and the OAuth callback"
    },
    {
      "id": "route-hub",
      "name": "10 endpoints for a conference showcase",
      "what": "The back end for a live demonstration stand: event logging, RSVPs, an outbound SMS through a gateway, a mocked payment step, an account lookup, a rendered report, spreadsheet setup, a dialler log — and a conversational turn against a hosted voice agent so visitors could talk to it.",
      "nodes": 40,
      "stack": [
        "Webhook",
        "Google Sheets",
        "SMS gateway",
        "Voice agent API",
        "Code"
      ],
      "pattern": "A spreadsheet is the whole database, which for something running for the length of an event is the right amount of infrastructure. The payment step is mocked on purpose and labelled as such, so nobody demonstrating it has to wonder whether it is charging anyone.",
      "trigger": "10 webhooks, 10 responses"
    },
    {
      "id": "meeting-sync",
      "name": "Meetings reconciled against the CRM calendar",
      "what": "Recorded sales meetings are matched against what the CRM calendar says happened. Transcripts come from the recording service, events and the user list come from the CRM, and the workflow decides per meeting whether the matching event needs updating or does not exist yet and has to be created.",
      "nodes": 20,
      "stack": [
        "Webhook",
        "GraphQL",
        "Zoho CRM",
        "Merge",
        "Code"
      ],
      "pattern": "Three sources are merged in sequence before anything is decided, because the match needs all three at once — the meeting, the calendar entry and the user who owns it. Deciding first and fetching later would have produced an event assigned to the wrong person.",
      "trigger": "Webhook, on demand"
    },
    {
      "id": "crm-bridge-flow",
      "name": "Store records between a CRM and the platform",
      "what": "A small API over store records: read one, search, create or update, delete, and the same operations in bulk for whoever is moving a whole list. An hourly job pushes what has changed into the contact-centre platform.",
      "nodes": 15,
      "stack": [
        "Webhook",
        "Schedule",
        "Switch",
        "Code"
      ],
      "pattern": "Two paths on purpose. Callers get the immediate answer; the scheduled push is what makes the bridge trustworthy, because a bridge that only reacts to events silently keeps whatever it dropped. Bulk operations are separate endpoints rather than a loop over the single one, so a partial failure is reported per record.",
      "trigger": "Webhook for the calls, hourly cron for the push"
    },
    {
      "id": "warehouse-feed",
      "name": "Scheduled report feed in XML over FTP",
      "what": "Three reporting queries — queue performance, agent queue activity and agent system time — run against the warehouse every half hour, are converted to XML and delivered to an FTP drop, because XML over FTP was what the system on the other end could accept.",
      "nodes": 15,
      "stack": [
        "Schedule",
        "BigQuery",
        "XML",
        "FTP"
      ],
      "pattern": "The consumer's format decided the design, not ours. Each report is generated and delivered independently, so one failing query does not hold up the other two, and the manual trigger stays next to the schedule because the first thing anyone wants after a missed window is to run it again by hand.",
      "trigger": "Schedule every 30 minutes, manual run kept"
    }
  ]
}