Codes anime weapons: developer view of a reward redemption console

Codes anime weapons: how reward systems work in Roblox titles

Codes anime weapons: how reward systems work in Roblox-style live-service games

A redemption code looks like a tiny string of characters, but inside a live-service game it sits on top of a small pipeline that decides who gets what, when, and why. Players searching for codes anime weapons usually want the strings themselves, yet the design choices behind those strings control whether the reward loop feels generous, fair, or exploitable. From a development perspective, the same architecture powers Anime Weapons on Roblox and dozens of similar experiences built on the platform. Studying that architecture, rather than chasing a single code, gives studios a way to ship reward systems that survive launch week, server merges, and the inevitable wave of community datamining.

this page treats the topic as a production problem. It walks through the redemption flow that a real title runs, the data shape that typically supports it, the failure modes that produce “code not found” errors, and the design trade-offs that determine whether a code campaign feels like a celebration or a chore. The goal is to give developers, technical designers, and producers a mental model they can reuse when their own anime-inspired Roblox experience needs its first seasonal drop.

What players mean when they search for codes anime weapons

The phrase combines two distinct intents that often appear together in Roblox search logs. The first is a player intent: someone wants active strings to paste into the redemption field inside the Anime Weapons experience. The second is a developer intent: someone building or studying a similar experience wants to know how those strings are authored, served, validated, and revoked. A useful page addresses both without blurring the line between them, because the player side and the platform side have very different success criteria.

For the player side, success is a short, scannable list of currently active codes, a clear explanation of how to paste them, and a note about what each code yields. Independent trackers such as the active code roundup maintained on IGN’s Anime Weapons guide are a good reference for how that surface area is presented to players. For the developer side, success is a description of the data, the API surface, the entitlement flow, and the failure modes that need to be tested before each batch ships. The two intents share the same domain object, a reward code, but they consume it through different products.

Because the player intent is short and the developer intent is deep, this page focuses on the developer side and links out to a live tracker for the player side. That split keeps the editorial page useful after a code expires, which is important because reward strings have a half-life measured in days, not months.

The lifecycle of a Roblox-style reward code

Every reward code moves through the same five stages inside a live-service game, regardless of the specific title. The stages are authoring, distribution, redemption, telemetry, and retirement. A production team that is shipping codes anime weapons, or a similar campaign, needs a clear owner for each stage and a defined artifact that the next stage consumes. Without that contract, the campaign becomes a spreadsheet on someone’s desktop and an outage waiting to happen.

Authoring is where a producer or live-ops designer defines a campaign, picks a reward bundle, and writes the canonical string. Distribution is where the string reaches a player, whether through a developer’s social channel, a partner outlet, or an in-game mail system. Redemption is the runtime call that converts the string into an entitlement. Telemetry is the stream of events that lets the team see which codes worked and which ones got abused. Retirement is the moment when a code stops working and the entitlement pool is closed.

A common mistake is to treat authoring and distribution as the entire job, and then to add redemption as a thin layer at the end. That ordering works for the first two campaigns, but it tends to fail when the entitlement pool needs to be rebalanced, when community datamining reveals a code early, or when a regional rollout has to be staged. Treating the five stages as a single pipeline forces a team to think about the data shape before any strings are written, which is much cheaper than redoing the pipeline after launch.

Designing the data shape behind a reward code

The internal representation of a code is the most important decision a team makes, because every later system has to read it. A reasonable Roblox-style reward system can be expressed in a small, engine-agnostic schema that the game server can read from a data store and that the redemption API can write to. The schema below is a pattern, not a guaranteed production API for a specific title, but it captures the fields that any similar system will need.

Field Purpose Typical type Failure mode if missing
code Canonical redemption string players paste short string Players cannot redeem at all
campaignId Groups codes that share a reward pool or window identifier Analytics cannot separate campaigns
rewardBundle List of entitlements granted on success array of items Successful redemptions grant nothing
startsAt Earliest timestamp the code is valid UTC timestamp Codes fire before the marketing push
endsAt Latest timestamp the code is valid UTC timestamp Codes stay redeemable after retirement
maxRedemptions Global cap on successful uses integer or null Reward pool drains faster than planned
perPlayerLimit Per-account cap integer or null One player claims the whole pool
platforms Optional allowlist of platforms array of strings Codes fire on platforms the team is not ready to support
region Optional allowlist of regions array of region codes Region-locked content leaks across the global pool
status Draft, scheduled, live, retired enum Live ops cannot pause a runaway code

The list above is intentionally minimal. A real production system often adds fields for soft caps, A/B test buckets, content ratings, and a flag for codes that should be hidden from partner trackers. What matters is that the schema treats the code as a campaign object rather than a single string, because every interesting question, such as “how many people redeemed the May drop”, “did the regional test work”, “do we need to extend the window”, depends on that structure.

The redemption flow in a Roblox experience

Once the schema exists, the redemption flow is a short, well-understood sequence. The client sends the typed string to a server endpoint, the server normalizes it, looks it up in the active code set, evaluates the eligibility rules, and either grants the bundle or returns a structured error. A flow that skips any of these steps tends to leak rewards or frustrate players with cryptic error codes.

  1. The player opens the redemption surface, often a small dialog or a settings page, and pastes the string.
  2. The client validates the shape of the string, trims whitespace, and applies the case rules the experience uses, then sends it to a server function.
  3. The server normalizes the string, looks it up in the active code set, and reads the campaign object.
  4. The server checks the time window, the platform allowlist, the region allowlist, the per-account cap, and the global cap.
  5. On success, the server grants the bundle through the inventory service and records a redemption event for telemetry.
  6. On failure, the server returns a structured error code that the client can render as a useful message rather than a generic “code not found” string.

The order of these steps is the part that matters most. If a code is checked against the time window before it is normalized, players can lose rewards because they pasted a trailing space. If the per-account cap is checked after the bundle is granted, a fast enough client can race the cap and double-claim. A server-authoritative flow that always reads, evaluates, and writes in a single function call is the simplest way to avoid those races.

Why codes anime weapons expire, leak, or stop working

Players searching for codes anime weapons often hit the same three failure modes. Each one has a different cause, and each one suggests a different fix on the developer side. Understanding the failure modes is more useful than memorizing any single list of strings, because the same patterns show up across most Roblox-style reward systems.

  • Code not recognized. The string is mistyped, includes a stray space, or uses the wrong case. On the server side this is a normalization problem: the redemption endpoint is comparing the raw input to a stored value without trimming or lowercasing first. A copy-to-clipboard flow in the client reduces this dramatically, but the server should still defend against it.
  • Code expired. The campaign’s end timestamp has passed and the active code set no longer contains the entry. This is expected behavior, but it is a failure mode from the player’s perspective, and the error message should explain that the campaign has ended rather than returning a generic not-found error.
  • Code at capacity. The global cap or per-account cap has been hit. This is the most common cause of “the code worked yesterday, why does it not work today” reports, and it is the failure mode that a server-side cap exists to prevent. A useful error tells the player whether the cap is personal or shared so they know whether to retry on a different account.

Two additional failure modes are less common but worth flagging. The first is a region or platform mismatch, where a code is valid only on certain clients and the player’s build is outside the allowlist. The second is a campaign that was retired but not removed from the active set, which is a state-management bug rather than a design choice. Both of these are easier to diagnose if the redemption endpoint returns a structured error code rather than a single boolean.

How community datamining changes the campaign window

Roblox experiences ship in client builds that players and tooling can introspect. Once a build is live, a sufficiently motivated community can find strings, even if those strings are not yet active, and share them on social channels. That reality reshapes the campaign window in a way that surprises a lot of first-time live-ops teams. The campaign is not “from launch to end date”, it is “from the moment the build is datamined to the moment the code is retired”.

For a campaign that targets codes anime weapons, the practical effect is that the authoring step should happen long before distribution. The team should write the code, define the reward, and store the campaign in a draft state while the build is still being prepared. Only when the build is locked and the marketing window is ready should the campaign be flipped to a scheduled state, and only when the social push goes live should it move to a live state. Each transition should be logged so the team can correlate community chatter with the moment the code went live.

A useful pattern is to keep a small library of decoy strings in the client that look like real codes but resolve to a “campaign not active” error. Decoys do not stop serious datamining, but they slow it down enough that the campaign window stays inside the marketing window. The decoys are themselves a campaign object, with their own reward bundle of “nothing” and their own time window, so they can be retired without touching the real codes.

Reward bundles: what the entitlement system has to support

A reward bundle is a small list of items, currencies, or avatars that the entitlement system grants on a successful redemption. In a Roblox-style game, the bundle typically includes in-game currency such as coins, soft currency like emeralds, consumables such as potions, cosmetic items such as avatars, and account-level items such as reset tokens. Each category of reward has a different entitlement flow, and the redemption endpoint has to know which flow to call.

Reward category Example from Anime Weapons Entitlement flow Pitfall if the flow is wrong
Soft currency Emeralds, coins Increment a player wallet row Wallet desyncs across server shards
Consumable Potions Append to a consumables inventory Stacks overflow or wrap
Cosmetic Avatars, weapon skins Set an ownership flag in a player profile Skin re-grant loops on re-login
Account token Reset tokens Append to a per-account counter Counter drift between client and server
Time-boxed buff XP boost Write an expiry timestamp to a player buff row Buff persists after the campaign window

The reward bundle should be authored as data, not as code, for two reasons. First, data-driven bundles let live ops tune the campaign without a build, which is the whole point of running a code campaign between patches. Second, data-driven bundles let the redemption endpoint be tested with synthetic bundles, which is much easier than writing per-bundle grant logic. The redemption endpoint then becomes a small interpreter that takes a bundle and routes each entry to the right entitlement flow.

Security: the difference between validation and trust

Client-side validation is a quality-of-life feature, not a security control. A Roblox-style experience will see clients that lie about the code, the player, the platform, and the redemption count. The server has to assume that any input can be forged and still produce the correct outcome. That assumption is what turns a redemption endpoint from a “does this string exist” check into a small authorization system.

The minimum checks the server should perform, in order, are: confirm the player is authenticated, confirm the code is in the active set, confirm the campaign is in a live state, confirm the player is inside the time window, platform allowlist, and region allowlist, confirm the global cap has not been hit, confirm the per-account cap has not been hit, and only then grant the bundle and record the redemption event. Any check that is missing turns into a different bug, and each bug has a different blast radius.

A useful exercise is to write a threat model for the redemption endpoint before the first code ships. The threat model lists, for each step in the flow, the actor that can lie about that step and the worst-case outcome if the server trusts the lie. For a campaign that ships codes anime weapons, the most common threats are: a forged client that claims a successful redemption it never made, a modified client that replays the redemption request, and a community tool that claims a redemption on behalf of a player. The threat model does not need to be a formal document, but the engineering team should agree on the answers before the campaign goes live.

Telemetry: what the redemption event has to carry

Telemetry is the difference between a campaign that the team can talk about and a campaign that the team can tune. The redemption event should carry enough context that a live-ops dashboard can answer the most common questions without a custom query. Those questions are: how many players redeemed the code, how many attempts failed and why, how long after launch did the redemption rate peak, and which platform or region drove the bulk of the conversions.

A reasonable redemption event for a Roblox-style experience carries the campaign identifier, the code itself, a hashed player identifier, the platform, the region, the timestamp, the success flag, and the structured error code when the redemption failed. The event should be written after the entitlement is granted, not before, so that a failure to grant does not produce a misleading success event. The event should also be sampled, because a hot campaign can produce more events than the analytics pipeline is sized for, and a sampling policy that biases toward capturing the first redemption per player is more useful than uniform sampling.

Dashboards built on these events tend to fall into two camps. The first is a campaign-level view that shows redemption curves, error distributions, and cap pressure for a single campaign. The second is a player-level view that shows how individual accounts move through the redemption funnel. Both are useful, but the campaign-level view is the one a producer needs to decide whether to extend a code, retire a code, or stage a follow-up drop.

Designing a useful error code surface

A redemption endpoint that returns a single boolean forces the client to guess why a code failed, and that guess is usually wrong. A small set of structured error codes gives the client a way to render a useful message and gives the team a way to measure which failure modes are actually happening. The set below is a starting point, not a complete list, and a real implementation usually adds a few domain-specific codes on top.

Error code Player-facing message Developer signal
code_not_found This code is not active right now. Check authoring and active set sync.
code_expired This code has ended. Retire the campaign on schedule.
code_not_started This code is not open yet. Confirm the startsAt timestamp.
cap_global This code has reached its limit. Plan the next drop or raise the cap.
cap_account You have already used this code. Confirm the per-account cap policy.
region_blocked This code is not available in your region. Check the region allowlist.
platform_blocked This code is not available on your platform. Check the platform allowlist.
rate_limited Too many attempts. Try again in a moment. Inspect the rate-limit policy.

The error code surface is also the right place to encode a rate-limit policy. Without a rate limit, a player can spam the redemption endpoint and either overwhelm the analytics pipeline or trigger the per-account cap in a way that looks like abuse. A per-account rate limit, applied before the entitlement check, turns spam into a small additional cost rather than a support ticket.

Localization and accessibility considerations

Reward codes are short strings, but the surrounding surface is text, and the text has to reach the audience the team is trying to reach. The redemption dialog, the error messages, and the campaign description should support the same languages as the rest of the experience, and the codes themselves should be drawn from a character set that is friendly to copy and paste. Avoiding visually similar characters, such as a capital I and a lowercase l, reduces the rate of “I typed it in and it does not work” support tickets, which is one of the most expensive failure modes for a live campaign.

Accessibility matters in two places. The first is the input field, which needs a label, a paste shortcut, and a clear way to clear and retry. The second is the success and failure feedback, which should be announced through the platform’s accessibility hook rather than relying on a visual flash. A campaign that runs for a week and reaches a few hundred thousand players will see a meaningful share of users who navigate the redemption surface with assistive tech, and the cost of getting it right is small compared with the cost of a wave of “the code worked but I did not see anything happen” reports.

Localization also affects the campaign window. A team that ships in multiple regions often stages the campaign, and the time window for each region has to be expressed in a timezone that the player can understand. The server can store everything in UTC, but the client should render the window in the player’s local time, and the error messages should reference the same local window so the player does not see “this code has ended” while the campaign is still live in their region.

Production pipeline: from spreadsheet to shipped campaign

A production pipeline for a reward code campaign is small but worth drawing, because the order of operations is the part that tends to be improvised. A pipeline that treats the campaign as a single object, with a single owner and a single set of artifacts, scales better than a pipeline that treats the campaign as a list of strings. The pipeline below is a pattern, and a real team will adapt it to the tools they already use, but the structure holds.

  • Brief. A producer or live-ops designer writes a one-page brief that names the campaign, the reward bundle, the target window, the target regions, and the success metric.
  • Data. The campaign is entered as a row in a campaign table, with the schema fields listed earlier, and the row is stored in a draft state.
  • Build. The game client is built with the campaign row in a draft state, and the redemption endpoint is exercised against the draft to confirm the flow works.
  • Lock. Once the build is locked, the campaign is moved to a scheduled state with a scheduled start timestamp.
  • Distribution. The marketing team receives the scheduled start timestamp, the codes, and the reward summary, and the campaign is announced on the agreed channels.
  • Live. At the scheduled start, the campaign is moved to a live state and the redemption endpoint begins to accept the code.
  • Monitor. The live-ops dashboard tracks the redemption rate, the error distribution, and the cap pressure.
  • Retire. At the scheduled end, the campaign is moved to a retired state and the code stops being accepted.
  • Review. The team writes a short post-mortem that compares the actual redemption curve to the forecast and captures any new failure modes.

Each of these steps has a defined artifact and a defined owner. The brief is the contract between live ops and the marketing team, the campaign row is the contract between live ops and engineering, the build is the contract between engineering and QA, and the post-mortem is the contract between the team and the next campaign. The artifacts are small, but the discipline of naming them is what makes a campaign that runs a dozen codes feel routine rather than heroic.

Testing a reward code campaign before it ships

A campaign that is not tested is a campaign that will be tested by players. The test plan for a Roblox-style reward system should cover the happy path, the structural failure modes, the policy failure modes, and the edge cases that the campaign brief calls out. The list below is a starting point, and a real test plan adds cases for the specific reward bundle and the specific region and platform allowlist.

  1. Redeem a known-good code on a fresh account and confirm the reward bundle arrives in the right inventory slot.
  2. Redeem the same code twice on the same account and confirm the second attempt returns a cap_account error.
  3. Redeem an expired code and confirm the error message identifies the campaign by name rather than returning a generic not-found.
  4. Redeem a not-yet-active code and confirm the error code distinguishes not-started from not-found.
  5. Redeem from a region outside the allowlist and confirm the error code identifies the region restriction.
  6. Redeem at the moment the global cap is reached and confirm the last successful redemption is recorded before the cap is enforced.
  7. Redeem while the redemption endpoint is under rate-limit pressure and confirm the error code is rate_limited rather than code_not_found.
  8. Redeem a code whose reward bundle references a removed item and confirm the entitlement system returns a clean error rather than a partial grant.

Each of these cases corresponds to a structural decision in the schema and the redemption flow. A test plan that is written after the schema is much cheaper than a test plan that is written after the campaign has been live for a week, because the team can run the cases against a staging environment rather than against production traffic.

Common design mistakes when a team first ships codes anime weapons

First-time live-ops teams tend to make the same set of mistakes, and most of them come from treating the code as a string rather than as a campaign. The list below is drawn from common post-mortems in similar Roblox-style titles, and each mistake has a structural fix that the team can apply before the next campaign.

  • Treating the code as the campaign. The code is a handle for the campaign, not the campaign itself. A team that stores only the string loses the ability to tune the window, the cap, or the reward bundle without a build.
  • Hard-coding the reward bundle. If the bundle lives in client code, a campaign that needs to be rebalanced requires a build, which means the campaign cannot be tuned live.
  • Skipping the per-account cap. A team that ships without a per-account cap will see a small number of players drain the reward pool on day one, which is a fairness problem and a community-relations problem.
  • Relying on client-side validation. A client-side check is a quality-of-life feature, not a security control. A team that trusts the client will see a wave of forged redemptions within hours of the campaign going live.
  • Retiring a campaign by deleting the row. Deleting the row destroys the audit trail. A team that retires a campaign by transitioning it to a retired state keeps the history and can answer “when did this code stop working” without a guess.
  • Announcing a code before the build is locked. Once a code is announced, the campaign window is open. A team that announces before the build is locked ends up with a campaign that goes live before it is ready, which is a support-ticket generator.

None of these mistakes are unique to a single title. They show up in most Roblox-style experiences that ship their first reward code, and they show up in similar live-service games on other platforms. The fix in each case is structural, not cosmetic, and the cost of applying the fix before launch is much smaller than the cost of applying it after a community thread starts tracking the failure mode.

How this maps to the Anime Weapons experience on Roblox

Anime Weapons is a Roblox experience that mixes anime-inspired worlds, quest loops, and reward strings, and it is a useful reference for the architecture described here. The codes anime weapons surface that players see is a small redemption dialog that grants coins, weapons, avatars, potions, emeralds, and reset tokens, and the published tracker pages list the active codes along with the rewards each one yields. The exact list rotates on a cadence that the developer controls, and the cadence is part of the live-ops plan rather than a side effect of the build.

From a production standpoint, the same building blocks apply. The campaign is a row in a data store, the redemption is a server function, the entitlement is a set of inventory writes, and the telemetry is a stream of redemption events. The player-facing surface is a dialog, the community-facing surface is a list of active codes on partner pages, and the developer-facing surface is a live-ops dashboard. The three surfaces share the same data and the same definitions, which is what makes the campaign repeatable.

A team that is building a similar experience does not need to copy Anime Weapons directly. The useful lesson is the shape of the pipeline: a campaign object, a redemption endpoint, an entitlement system, a telemetry stream, and a small set of structured error codes. The exact reward categories will differ, the exact codes will differ, and the exact cadence will differ, but the pipeline is the part that does not change between campaigns and the part that is worth investing in early.

Decoupling the campaign from the build

The single most useful investment a team can make is to decouple the campaign from the build. A campaign that is defined as data, not code, can be authored, scheduled, and retired without a build, which means the live-ops team can respond to community feedback, to a partner request, or to a competitive event without waiting for the next patch. A campaign that is defined as code requires a build, which means the live-ops team is on the same cadence as the engineering team, which is a much slower cadence than the community expects.

The decoupling has a cost. The redemption endpoint has to be a small interpreter that can read a campaign row and route the bundle to the right entitlement flow, and the entitlement system has to be a small set of grant functions that can be called from that interpreter. The cost is paid once, in the form of a small piece of infrastructure, and the benefit compounds with every campaign. A team that has shipped two or three campaigns with the infrastructure in place tends to ship the next one in a fraction of the time, because the pipeline is already built and the team is only writing the campaign row.

A useful test for the decoupling is to ask whether a producer can write a new campaign row, schedule it for next week, and retire it without a build. If the answer is yes, the pipeline is decoupled enough. If the answer is no, the pipeline is still entangled with the build, and the next campaign will be more expensive than it needs to be.

What to monitor after a campaign goes live

Once a campaign is live, the live-ops team has to watch a small set of metrics, and those metrics fall into three buckets. The first bucket is redemption volume, which tells the team how the campaign is being received. The second bucket is error distribution, which tells the team whether the redemption endpoint is healthy. The third bucket is cap pressure, which tells the team whether the campaign is going to end on schedule or whether it needs an extension.

  • Redemption volume. Track the total number of successful redemptions, the unique player count, and the redemption rate over time. A campaign that peaks within the first hour and then decays quickly is being shared on a small number of channels. A campaign that peaks more slowly and decays over a few days is being shared more broadly.
  • Error distribution. Track the structured error codes returned by the redemption endpoint. A spike in code_not_found usually means the community is sharing a string that was never live, which is a distribution problem. A spike in cap_account usually means the per-account cap is too tight or the community is testing the same string on multiple accounts.
  • Cap pressure. Track the global cap and the per-account cap separately. A campaign that is going to hit the global cap before the scheduled end needs a decision: extend the cap, retire the campaign early, or stage a follow-up drop. Each option has a different blast radius and a different community signal.

The monitoring does not need to be a full real-time dashboard for a first campaign. A small set of scheduled queries against the telemetry stream is enough to catch the most common failure modes, and a real-time view can be added once the team has shipped two or three campaigns and knows which metrics actually matter.

Frequently asked questions

What is the simplest way to store a reward code in a Roblox-style game?

Store the code as a campaign object with a canonical string, a reward bundle, a time window, a global cap, and a per-account cap. The string is the player-facing handle, but the other fields are what make the campaign tunable without a build.

How do I stop one player from redeeming a code too many times?

Enforce a per-account cap on the server as part of the redemption flow, and check the cap after the campaign is identified but before the entitlement is granted. A client-side check is not enough because a modified client can lie about the redemption count.

Why does a code stop working after a few days?

Most live-service campaigns retire a code by a scheduled end timestamp, and a few use a global cap. Once either the timestamp passes or the cap is hit, the redemption endpoint returns a structured error such as code_expired or cap_global rather than accepting the code.

What is the difference between a global cap and a per-account cap?

A global cap limits the total number of successful redemptions across all players and protects the reward pool from draining too quickly. A per-account cap limits the number of successful redemptions on a single account and protects the campaign from being claimed by a small number of high-volume players.

Should the redemption endpoint be a server function or a client function?

It should be a server function, with the client as a thin wrapper that normalizes the input and renders the result. The server is the only place that can read the campaign row, evaluate the caps, and grant the entitlement in a way that players cannot forge.

How do I test a reward code campaign before it goes live?

Run a test plan that covers the happy path, the structural failure modes, the policy failure modes, and the edge cases called out in the campaign brief. The cases listed here are a useful starting point, and a real test plan adds cases for the specific reward bundle and the specific region and platform allowlist.

What is the role of structured error codes in a redemption endpoint?

Structured error codes let the client render a useful message and let the team measure which failure modes are actually happening. A single boolean return forces the client to guess, and the guess is usually wrong, which turns a small failure into a support ticket.

How often should a team ship a new code for a Roblox experience?

The cadence is a live-ops decision rather than a technical one, and it depends on the size of the reward pool, the cost of authoring a new campaign, and the community signal. A common pattern is a small drop on a regular cadence with a larger drop around content updates, and the cadence is tuned over time based on the redemption curve.

Can a redemption endpoint survive a community datamining the build early?

Yes, if the campaign is in a draft or scheduled state when the build ships. The redemption endpoint should treat the campaign state as the source of truth, and a code that is in a draft state should return a code_not_started error regardless of whether the string is in the build.

What is the cheapest fix for a campaign that is going to hit its global cap early?

Raise the global cap if the reward pool can absorb it, or retire the campaign early and stage a follow-up drop with a fresh code. The two options have different community signals: a raised cap reads as generosity, an early retirement reads as scarcity, and the team should pick deliberately rather than by default.

Categories:

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *