← Back to the journal

Create a developer tutorial that is worth referencing

Turn one SaaS integration problem into a reproducible developer tutorial with test inputs, expected results, failure cases, and a maintenance plan.

Hands review a tutorial kit showing the same sample event delivered twice to a receiver, with one work item as the expected result. Fixture, steps, assertion, and reset cards support the exercise; the observed result remains marked not run.
Conceptual editorial artwork · Generated with AI for FindVex

A developer follows your integration tutorial, gets a different response, and cannot tell whether the problem is their environment, your code, or a changed API. The missing detail might be a dependency version, a sample payload, or the output that confirms a step worked.

Build around one integration problem and give readers enough information to reproduce the result, diagnose a failure, and repeat the exercise. Another developer then has something specific to reference in a support answer, implementation ticket, or technical guide.

Start by checking whether someone in the intended audience can complete the exercise without private help. Earning links remains a possible outcome.

Choose a problem with an observable finish

Look for a blocked step in public issues, documentation discussions, or support questions you have permission to use. Record the original wording and source separately from your interpretation.

A question about receiving the same webhook twice suggests a different article from a question about setting up an endpoint. Both involve webhooks, but the reader’s starting point and desired result differ.

Choose a problem you can demonstrate with safe inputs and a clear result. Identify the reader’s current setup, the action they cannot complete, and the dependencies your team would need to maintain.

One discussion can reveal a useful problem; it cannot establish how common that problem is. If the evidence is thin, ask a developer with the relevant setup to assess the proposed exercise. FindVex’s pain-point evidence sheet helps keep source language, context, and interpretation separate.

Write the finish condition before the introduction. For example: “After replaying the same sample event, the database still contains one work item.” Use that condition to decide which steps and tests belong in the tutorial.

Define what the reader will build and learn

Choose one supported path: a language, framework, storage option, and bounded outcome. Label other environments as untested unless you have checked them.

Diátaxis describes tutorials as guided learning experiences built around practical activity, with visible results and clear expectations. Show readers what they will build, then pair each meaningful action with a way to check their progress. Diátaxis tutorial guidance

For the webhook example, the activity is replaying an event and inspecting the database. The lesson is how a stored event identifier helps the receiver recognize a repeated delivery. State both in the brief so the walkthrough teaches something beyond copying commands.

Near the beginning, list prerequisites, required accounts, possible costs, and what the exercise leaves out. Readers should be able to decide whether to continue before installing anything.

Keep lengthy architectural explanations in linked notes. Where a choice affects correctness, explain it beside the relevant step.

Package the example for a clean run

Treat the article and its example files as one deliverable. Include:

  • Exact runtime and dependency versions, plus the relevant lockfile.
  • Sample configuration with placeholders and an explanation of each value.
  • Synthetic input files and a documented initial database state.
  • Commands in execution order, including the working directory.
  • Expected responses or assertions after meaningful steps.
  • Reset and cleanup instructions for repeat runs.

Distinguish fixed output from variable output. If a timestamp or generated identifier changes, say which fields matter and what relationship should hold. Give readers a copyable assertion when a screenshot would leave them comparing irrelevant details.

Run the instructions from a clean environment with no cached setup from the author’s machine. Then have another developer follow only the materials intended for publication. Record where they pause, improvise, or need clarification. Automated checks can pass while the prose still omits a setup step.

For an integration that includes an AI model, specify which outputs you will check, such as required fields or a schema. Record answer-quality judgments separately so a structurally valid response does not count as proof of a useful answer.

Worked example: plan a duplicate webhook tutorial

Suppose a small SaaS team wants to teach developers how to prevent repeated delivery of one event from creating duplicate work. This is a hypothetical tutorial design; no implementation or test results are presented here.

The proposed title is “Handle a repeated Stripe webhook without creating a second work item.” The exercise uses a local receiver, a database, synthetic fixtures, and a fake worker. It performs no billing actions.

Stripe documents that webhook endpoints can receive the same event more than once and recommends tracking processed event IDs. It also requires the raw request body for signature verification. Those facts support including duplicate-delivery and altered-body checks. Stripe webhook documentation

Prepare a synthetic fixture with an event identifier such as evt_demo_001, clearly labeled as test data. Use a local harness to sign requests with a secret reserved for the exercise. Generate a fresh timestamp and signature for each valid delivery attempt: Stripe documents that its deliveries receive new timestamps and signatures and that signature verification includes a recency check. Stripe’s replay protection guidance

The harness checks the local verification path. A separate sandbox check would be needed to demonstrate delivery from Stripe.

Before writing the walkthrough, define the setup and intended result for each test:

Test Starting state and action Intended result
First delivery Empty test database; send one valid request One durable work item
Sequential duplicate Keep the first work item; deliver the same event again Still one work item
Concurrent duplicate Empty test database; send two valid deliveries of the same event concurrently One work item after both requests finish
Altered body Empty test database; change the body after signing Verification fails; no work item
Storage failure Make storage unavailable; send a valid request No success acknowledgment
Receiver restart Keep the first work item and stored event record; restart only the receiver and redeliver Still one work item

These are acceptance criteria to test, not observed results. Keep the database intact for the sequential and restart cases; resetting it would remove the state those tests are meant to inspect.

For this proposed design, recording the event and creating the work item should succeed or fail together. Have an engineer review the transaction boundary and uniqueness constraint. Test concurrent delivery even if sequential replay passes: checking for an existing record and then inserting one leaves behavior under simultaneous requests unresolved.

Show the database assertion alongside the HTTP response. A successful response alone does not establish how many work items exist.

Keep the limit beside the result: this exercise covers repeated delivery of the same event identifier and durable enqueueing. It does not establish exactly-once execution of an external side effect. Stripe also documents duplicates involving distinct Event objects; handling those requires a separate design. Stripe’s duplicate-event guidance

Teach one failure and its recovery

After the first successful run, introduce a controlled failure that teaches the central concept. Give the reader the input, the observable symptom, and the recovery step.

For the webhook exercise, change the body after signing and confirm that verification rejects the request. Then restore the original body and generate a fresh test signature. Explain that signature verification depends on the body received by the endpoint matching the signed body.

Keep incidental setup problems in troubleshooting notes. Describe what to inspect before suggesting a fix. A “connection refused” error calls for a different investigation from a valid response with no database record.

Spend the most testing effort on failures that could invalidate the title’s promise. Protection against duplicates requires attention to repeated and concurrent delivery. If an important boundary remains untested, narrow the promise and name that boundary.

Give readers a precise, durable reference

Use a descriptive title that names the task and relevant technology. Add headings readers can link to directly, especially for test inputs, failure behavior, and limitations. Keep the core explanation and example accessible without a marketing signup.

Link code references to the version used by the article. GitHub explains that ordinary branch links can change as new commits arrive, while a URL containing a commit ID identifies a fixed version. On a file page, press y to create that permalink. GitHub’s permalink documentation

Keep a stable article URL and identify its tested code revision. If you retain an older example alongside a newer one, make clear which revision each set of instructions describes.

Make the article’s contribution easy to find: a tested sequence, a reusable fixture, or an explanation of a failure readers would otherwise need to investigate themselves. Google’s content guidance asks about originality, added value, clear sourcing, and whether readers can achieve their goals. Use those questions to review the tutorial without treating them as a guarantee of rankings or links. Google’s helpful-content guidance

Copy the tutorial brief and test record

Use this template to plan the tutorial and record what has actually been checked. Leave results marked “not run” until testing is complete.

Reader and current setup:
Source of the blocked task:
Observable finish condition:
Concept the exercise teaches:
Supported environment and exact versions:
Prerequisites, accounts, and possible costs:
Code revision and fixture locations:
Setup, reset, and cleanup instructions:
Production limits and untested environments:
Maintenance owner and retest trigger:

Test case:
Starting state:
Input and command or action:
Expected response and state assertion:
Observed result: not run
Test date and code revision:
Evidence location:
Recovery step:
Unresolved issue and next action:

Independent reader check:
Environment and code revision:
Completion result: not run
Where help or improvisation was needed:
Revision needed before release:

Duplicate the test-case fields for each success or failure check. For the hypothetical sequential duplicate case, a planning entry could read:

Test case: Repeated delivery of evt_demo_001
Starting state: First delivery has created one work item;
  retain that item and its stored event record.
Input and action: Send the same fixture with a fresh test signature.
Expected assertion: Work-item count for evt_demo_001 remains 1.
Observed result: not run
Recovery step: If the count differs, inspect the stored event ID
  and insertion path before repeating the test.

Attach the actual command and evidence location when the implementation exists. A planned assertion describes what you intend to prove; the observed result records what happened.

Assign maintenance and prepare the first fixture

Choose retest triggers that match the dependencies: an SDK upgrade, an API change, or a reader reporting a mismatch. Show a last verified date only after rerunning the relevant checks. If maintenance is no longer practical, state the supported version and known gap.

Track successful independent completions, reproducible bug reports, and relevant references you can inspect. Visits and repository interest can suggest where to investigate, but they do not establish whether anyone completed the integration.

Choose one blocked task and fill in the brief’s finish condition. Prepare its first fixture and write the assertion that would demonstrate success. Then assign someone to attempt the clean run and record where the instructions need work.