Embedding

Listening to events

The SDK emits seven lifecycle events. Wire callbacks at init time — or attach later with player.on().

At init time

js
const player = Playgent.init({
  containerId: "playgent-host",
  game: "sudoku",
  mode: "daily",
  onReady:    (data) => console.log("ready", data),
  onView:     (data) => console.log("in viewport", data),
  onStart:    (data) => console.log("started", data),
  onHint:     (data) => console.log("hint used", data),
  onComplete: (data) => console.log("completed", data),
  onEnd:      (data) => console.log("end-screen CTA pressed", data),
  onError:    (err)  => console.warn("error", err),
});

Attaching later

js
player.on("complete", (data) => track("playgent.completed", data));
player.on("error", (err) => Sentry.captureMessage(`Playgent ${err.code}`));

player.off("complete") removes the handler.

Common patterns

Track completions in your analytics tool

js
Playgent.init({
  containerId: "playgent-host",
  game: "sudoku",
  mode: "daily",
  externalUserId: currentUser.id,
  onComplete: ({ score, won, timeMs }) => {
    analytics.track("Playgent puzzle completed", {
      score, won, timeMs,
    });
  },
});

Show a CTA only when a user finishes

js
let completed = false;
Playgent.init({
  /* … */
  onComplete: () => {
    completed = true;
    document.querySelector("#newsletter-cta").classList.remove("hidden");
  },
});

Detect impressions for ad metrics

onView fires once when at least 50% of the iframe is in the viewport (configurable).

js
Playgent.init({
  /* … */
  viewThreshold: 0.6,
  onView: ({ intersectionRatio }) =>
    track("playgent.impression", { ratio: intersectionRatio }),
});

Reference

The complete schema for every event payload is on the SDK events reference.