Almost Paid
nestyme/awesome-prompts
Find the users who almost paid — saw the paywall, started checkout, ran out of free credits, let a trial lapse — size what they are worth, and turn them into a one-screen dashboard with a…
How to actually instrument product analytics correctly. An agent skill from rampstackco/claude-skills.
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install rampstackco/claude-skills product-analytics-setup --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/product-analytics-setup .claude/skills/product-analytics-setup && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .claude/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setupType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install rampstackco/claude-skills product-analytics-setup --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/product-analytics-setup .agents/skills/product-analytics-setup && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .agents/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install rampstackco/claude-skills product-analytics-setup --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/product-analytics-setup .cursor/skills/product-analytics-setup && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .cursor/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/rampstackco/claude-skills.git --path skills/product-analytics-setup--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install rampstackco/claude-skills product-analytics-setup --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/product-analytics-setup .gemini/skills/product-analytics-setup && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .gemini/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install rampstackco/claude-skills product-analytics-setupInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/product-analytics-setup .github/skills/product-analytics-setup && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .github/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add rampstackco/claude-skills --skill product-analytics-setup -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install rampstackco/claude-skills product-analytics-setup --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/rampstackco/claude-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/product-analytics-setup .opencode/skills/product-analytics-setup && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "product-analytics-setup" agent skill from https://github.com/rampstackco/claude-skills/tree/main/skills/product-analytics-setup into .opencode/skills/product-analytics-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "product-analytics-setup", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
product-analytics-setupHow to actually instrument product analytics correctly. An agent skill from rampstackco/claude-skills.
Product Analytics Setup is an agent skill from rampstackco/claude-skills. How to actually instrument product analytics correctly. Event taxonomy, property design, naming conventions, schema versioning, identity stitching, funnel design, retention cohorts, North Star metric selection, dashboard hygiene, instrumentation debt, and the failure modes that produce data nobody trusts. Triggers on product analytics setup, event taxonomy, tracking plan, instrumentation, schema versioning, North Star metric, retention cohorts, funnel design, naming conventions, instrument new feature, audit…
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 11 other files, including reference files (for example `README.md`, `references/cohort-definition-patterns.md` and `references/common-failures.md`).
It sits in Data & Analytics, covering Product analytics. It works with Mixpanel and PostHog. The repository describes itself as: Stack-agnostic Claude Skills covering the full website lifecycle: brand, design, content, SEO, dev, ops, growth, and research. Build, ship, audit, optimize. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 482c9bf. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Product Analytics Setup loads about 5.9k tokens when it runs, and up to ~23k if it reads all its reference files. Until then it costs about 211 tokens; SKILL.md has 2,989 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from rampstackco/claude-skills at commit 482c9bf, republished under its MIT licence (© rampstackco). 2,989 words, ~5,939 tokens.
.claude/skills/product-analytics-setup/SKILL.md (or your agent's skills folder). This skill also uses 10 other files; get the full folder from GitHub.A senior PM and analyst's playbook for instrumenting product analytics correctly the first time.
Most product analytics setups are some combination of inherited mistakes, dashboard sprawl, and events nobody trusts. The team launches a new feature; instrumentation gets bolted on under deadline pressure; naming drifts; properties are inconsistent; six months later nobody can answer simple questions because the answer depends on which event you trust.
This skill is the discipline that prevents that. It assumes you have answered the strategic questions about what to measure (see analytics-strategy). It assumes you have a tool connected (Mixpanel, Heap, PostHog, Amplitude, or warehouse-native via BigQuery, Snowflake, or dbt). The hard part is the systematic execution: naming conventions, property design, schema versioning, funnel construction, cohort definitions, retention measurement.
When to use this skill: setting up product analytics from scratch, auditing an existing instrumentation, fixing a "we have data but cannot trust it" problem, or designing instrumentation for a new feature.
This skill spans instrumentation execution. It does not cover measurement strategy (use analytics-strategy), experimentation result interpretation (use experimentation-analytics), paid media analytics (use ads-performance-analytics), or platform decisions (use experimentation-platform-orchestrator). Pair this skill with the relevant integrations microsite for your specific tool.
The clean distinction from analytics-strategy. That skill (Growth category) is strategic: what to measure and why, KPI hierarchy, dashboard architecture, attribution models. This skill (Product category) is execution: how to actually instrument the product correctly. The two compose. Read analytics-strategy first to decide what matters; read this skill to instrument it.
The mental model. Every analytics setup is a stack of layers. Each layer depends on the one below it being correct.
user_signed_up, checkout_completed, feature_x_used.anonymous_id, user_id, account_id.You cannot construct higher levels without correct lower levels. Garbage events produce garbage funnels. The discipline is bottom-up. Most "we have data but cannot trust it" problems trace back to the bottom two layers.
Three rules for event design.
checkout_completed, not checkout_complete or completing_checkout. Past tense reads as "this happened" rather than as a state.video_played, form_submitted, email_opened. Reading the event name aloud should describe what happened.checkout_completed once at the moment of completion, not submit_button_clicked plus checkout_completed. UI events are noise; semantic events are signal.The verbs vs states trap.
checkout_completed, subscription_canceled, account_upgraded.user_status: active is a property on the user, not an event. Setting state via events ("status_changed_to_active") is a code smell that produces double-counting.How many events to design. Thirty to fifty events is the sweet spot for a typical SaaS product. Below twenty means under-instrumented; above one hundred almost always means tracking UI noise or duplicating events in different formats.
Detail and a canonical event spec in references/event-taxonomy-template.md.
Two property types, treated separately.
Event-level properties describe THIS event. The checkout_completed event has properties like cart_value, item_count, payment_method, discount_code. They live on the event payload and are immutable once fired.
User-level properties describe the USER over time. subscription_tier, lifetime_value, acquisition_channel. Set them once on the user profile; the analytics tool joins them onto every event the user fires. They update over time as the user changes.
The trap. Putting user-level properties on every event. Do not track subscription_tier on every event payload; set it once on the user profile and rely on the join. Putting it on the event creates payload bloat, schema drift when the value changes, and reporting confusion when a user upgrades mid-session.
Data type discipline.
trial_day: 7).is_admin, has_trial, is_new_user. Two values; nothing else.Worked example in references/property-design-patterns.md showing right and wrong design for a product_viewed event.
Pick ONE convention and enforce it. Three conventions worth picking.
user_signed_up, cart_value. Most platforms default to this; pushback is rarely worth it.user_signed_up, video_played. Reading the name should describe what happened.subscription_tier, is_admin, last_active_at.What NOT to do.
user_signedUp, User Signed Up, userSignedUp all coexisting in the same project. Pick one and migrate.user_signed_up plus completedCheckout plus VIEW_PRODUCT in the same project means nobody can predict an event name without looking it up.mailchimp_email_opened ages badly when you switch to Customer.io.The naming convention reference file provides a complete style guide. Cite it in your team's data contract.
Detail in references/naming-convention-reference.md.
Schema changes are inevitable. The pattern.
Additive changes are safe. New event, new property on an existing event, new value in an enum. Just ship. Existing dashboards continue to work.
Breaking changes require migration. Renamed event, removed property, changed property type, narrowed enum. These break dashboards downstream; the migration plan is part of the change.
Versioning patterns.
_v2 to events when semantics change. checkout_completed_v2 fires alongside checkout_completed during a transition.The data contract idea.
Detail in references/schema-versioning-patterns.md.
Funnels measure progression through a sequence. Four rules.
page_view or session_start. Vanity-event-anchored funnels show 99% drop-off and tell you nothing.Common funnel mistakes.
session_started happens for every visit; using it as a step inflates the denominator and makes the rest of the funnel meaningless.Common funnel shapes and time-window guidance in references/funnel-design-templates.md.
A cohort is a group of users sharing an attribute or behavior. Useful patterns.
subscription_tier: pro. Useful for segment-level analysis.Cohort discipline.
Detail in references/cohort-definition-patterns.md.
Retention is repeat behavior over time. Three flavors.
For most SaaS products, bracket retention is the right default. Day-7 is high-noise; week-2 (bracket) is more stable. Day-1 retention is almost always over-indexed to onboarding effects rather than product-market-fit signal.
Retention curve interpretation.
Detail in references/retention-measurement-patterns.md.
North Star metric (NSM) selection rules.
Bad NSMs. Signups (vanity; many signups never activate). Revenue (lagging; not action-oriented; varies by mix). DAU (only useful for engagement-driven products; misleads on monthly-cadence products).
Better NSMs. Weekly active editors (Figma). Nights booked (Airbnb). Messages sent per day (Slack). Products created per workspace per week (Linear). Each names a user-value action that maps to business growth.
Supporting metrics framework.
Detail and product-type-specific examples in references/north-star-metric-selection.md.
A dashboard is trustable when four things are true.
fct_orders, last 30 days, joined to dim_customers."The stale dashboard failure mode. A dashboard built two years ago is still in use. The underlying schema changed; the dashboard's query points at columns that no longer exist or now mean something different. The team makes decisions on broken numbers and does not realize until something breaks loudly.
Prevention. Every dashboard has an owner, a refresh cadence, and a quarterly audit. Dashboards without an owner get deprecated. Dashboards that have not been refreshed in 90 days get deprecated. The half-life of a dashboard is shorter than the half-life of the product.
The compounding cost of cutting corners.
Instrumentation debt is real and compounds like technical debt. The discipline.
Detail in references/instrumentation-audit-checklist.md.
Twelve patterns recur across product analytics setups. The short version.
Detail in references/common-failures.md.
When designing or auditing product analytics, walk these 12 considerations. Skipping any of them is how the team ends up with data nobody trusts.
_v2 suffix during transitions. Data contract in code.The output of the framework is a tracking plan. A list of events with their properties, the canonical user identity, the named cohorts, the named funnels, the retention measurement choice, the named NSM, the dashboard owners. The plan lives in code and gets reviewed like any other product spec.
This skill's output depends on data, measurements, or tool results it cannot generate on its own. When a required input, tool, or data source is unavailable or unverifiable, the sanctioned output is the deliverable with the gap stated: what was needed, what was actually obtained or verified, and which parts of the output are affected. Fabricating, estimating, or interpolating a required number to complete the deliverable is never sanctioned. A stated gap is a complete answer.
references/event-taxonomy-template.md - Canonical event spec for typical SaaS: account, user, activation, engagement, conversion, retention events with required properties.references/property-design-patterns.md - Event-level vs user-level patterns. Type discipline. Worked example: product_viewed right vs wrong.references/naming-convention-reference.md - Complete style guide. snake_case, past tense, object-action. Boolean prefixes. Money in cents. Timestamps with _at suffix. Do/don't side-by-side.references/schema-versioning-patterns.md - Additive vs breaking changes. _v2 suffix pattern. Data contract in TypeScript. CI lint patterns.references/funnel-design-templates.md - Activation, conversion, engagement, feature adoption funnels. Time windows, anchor events, drop-off interpretation.references/cohort-definition-patterns.md - Acquisition, behavioral, property, combined cohorts. SQL examples plus tool-specific examples.references/north-star-metric-selection.md - NSM rules with examples by product type. Anti-patterns. Migration patterns when changing NSM.references/instrumentation-audit-checklist.md - Quarterly audit playbook: schema review, volume sanity checks, dashboard freshness, owner audit, deprecation candidates.references/common-failures.md - Twelve failure patterns with symptom, root cause, fix, prevention.Most product analytics setups are over-instrumented, not under-instrumented. Tracking every button click produces noise that drowns the signal. The discipline of saying "we do not need to track that" is harder than "let us track that just in case." Default to less.
The data you do not have can be added later. The data you over-collected costs you forever, in dashboard performance, in schema complexity, in signal-to-noise. The team that ships with thirty well-designed events and a small set of named cohorts outperforms the team that ships with two hundred events and no cohort discipline.
When the team disagrees on whether to add an event, the question is not "could this be useful?" but "what specific decision will this event inform, and is the decision worth the instrumentation cost?" If the answer is "we might want to know" the answer to the question is no.
© rampstackco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 10 other files (references) in skills/product-analytics-setup of rampstackco/claude-skills.
Open the folder on GitHubat commit 482c9bf
Product Analytics Setup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Product Analytics Setup this skillrampstackco/claude-skills | 940 | — | ~5.9k | Automated safety check: Pass | MIT | |
| Almost Paidnestyme/awesome-prompts | 151 | — | ~3.9k | Automated safety check: Pass | None | |
| Telemetry Standardssupabase/supabase | 111k | — | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Prod TelemetryUsefulSoftwareCo/executor | 4.1k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Posthog Product Health Auditboardsesh/boardsesh | 163 | — | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Posthog Instrumentationlangfuse/langfuse | 36k | — | ~3.2k | Automated safety check: Pass | Custom licence |
nestyme/awesome-prompts
Find the users who almost paid — saw the paywall, started checkout, ran out of free credits, let a trial lapse — size what they are worth, and turn them into a one-screen dashboard with a…
supabase/supabase
PostHog event tracking standards for Supabase Studio. An agent skill from supabase/supabase.
UsefulSoftwareCo/executor
Query Executor's production telemetry — Axiom traces (executor-cloud dataset), prod Postgres via PlanetScale, PostHog product analytics — through the Executor MCP.
boardsesh/boardsesh
Mine Boardsesh's PostHog telemetry (error tracking, session recordings, product analytics) with a multi-agent workflow, then file verified, deduplicated, severity-labelled GitHub issues.
langfuse/langfuse
Product analytics with posthog. An agent skill from langfuse/langfuse.
PostHog/posthog
Creates product analytics or SQL-backed box plot insights in PostHog.
rampstackco/claude-skills
Run a structured after-action review (postmortem, retrospective) on a launch, incident, or completed project to capture timeline, root cause analysis, contributing factors, and actionable lessons.
rampstackco/claude-skills
Design measurement frameworks including event taxonomy, KPI hierarchy, dashboard architecture, attribution models, and analytics implementation strategy.
rampstackco/claude-skills
Build or audit a comprehensive brand style guide that documents the full brand system including story, logo system, color, typography, imagery, voice, applications, and dos/don'ts.
rampstackco/claude-skills
Develop or document a complete brand voice and tone system covering voice attributes, tone shifts by context, vocabulary preferences, grammar rules, and copy examples.
rampstackco/claude-skills
Write or edit website copy, blog content, and editorial pieces with attention to voice, structure, and goal.
rampstackco/claude-skills
Develop a content strategy covering editorial positioning, content pillars, formats, calendar, governance, and topical authority planning.
Categories
How to actually instrument product analytics correctly. An agent skill from rampstackco/claude-skills. Product Analytics Setup is an agent skill from rampstackco/claude-skills. How to actually instrument product analytics correctly.
Product Analytics Setup fits situations like: product analytics setup; instrumentation; schema versioning; north Star metric.
Run `npx skills add rampstackco/claude-skills --skill product-analytics-setup -a claude-code`. Or copy the skill folder (skills/product-analytics-setup in rampstackco/claude-skills) into .claude/skills/product-analytics-setup in your project. Claude Code loads it when a task matches its description.
Run `npx skills add rampstackco/claude-skills --skill product-analytics-setup -a codex`. Or copy the skill folder (skills/product-analytics-setup in rampstackco/claude-skills) into .agents/skills/product-analytics-setup in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add rampstackco/claude-skills --skill product-analytics-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/product-analytics-setup, .gemini/skills/product-analytics-setup, .github/skills/product-analytics-setup and .opencode/skills/product-analytics-setup in your project.
SKILL.md names no scripts, command-line tools or credentials: Product Analytics Setup is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Product Analytics Setup is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 17k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Product Analytics Setup: Almost Paid (nestyme/awesome-prompts, 151 stars), Telemetry Standards (supabase/supabase, 111k stars), Prod Telemetry (UsefulSoftwareCo/executor, 4.1k stars) and Posthog Product Health Audit (boardsesh/boardsesh, 163 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
rampstackco (a GitHub organization) maintains it in rampstackco/claude-skills, which has 940 GitHub stars. The repository holds 103 skills in this directory. The repository was last updated on October 7, 2026.
Source: rampstackco/claude-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.