Tracking Recipes
Feedback Tracking
Track user feedback (e.g., thumbs up/down on documentation pages) using both server actions and client-side hooks.
Server Action (Next.js)
"use server";
import { Databuddy } from "@databuddy/sdk/node";
const client = new Databuddy({
apiKey: process.env.DATABUDDY_API_KEY!,
websiteId: process.env.DATABUDDY_WEBSITE_ID,
});
export async function onRateDocs(
url: string,
feedback: { opinion: "good" | "bad"; message: string }
) {
try {
await client.track({
name: "docs_feedback",
properties: {
url,
opinion: feedback.opinion,
has_message: feedback.message.trim().length > 0,
message_length: feedback.message.trim().length,
},
});
await client.flush();
return { success: true };
} catch (error) {
console.error("Failed to track feedback:", error);
return { success: false, error: "Failed to submit feedback" };
}
}Client Hook Wrapper
import { track } from "@databuddy/sdk";
import { useCallback } from "react";
export function useFeedbackTracking() {
const trackFeedback = useCallback(
(url: string, opinion: "good" | "bad", message?: string) => {
track("feedback_submitted", {
url,
opinion,
has_message: !!message,
message_length: message?.length ?? 0,
});
},
[]
);
return { trackFeedback };
}Usage
function FeedbackComponent() {
const { trackFeedback } = useFeedbackTracking();
const pathname = usePathname();
const handleFeedback = (opinion: "good" | "bad", message?: string) => {
trackFeedback(pathname, opinion, message);
// Submit to server action
onRateDocs(pathname, { opinion, message: message ?? "" });
};
return (
<div>
<button onClick={() => handleFeedback("good")}>👍 Good</button>
<button onClick={() => handleFeedback("bad")}>👎 Bad</button>
</div>
);
}What It Tracks
Benefits
Related
How is this guide?