Step-by-step guide

CardSwap tutorial

This page explains the full flow from account setup to imports, dashboard filters, matches, chat, and how pricing works behind the scenes.

Quick start

The shortest path from zero to your first trade

If you just want the fastest setup, follow these steps in order and then come back to the deeper sections when you need more detail.

1

Create your account and confirm your email

Use the registration flow, then open the confirmation link from the email before you try to log in.

2

Import cards into offers or wishlist

Open the import page, pick the target list, and then use single cards, a public deck URL, or a pasted list.

3

Review your collection in the dashboard

Use the search box, pagination, and filters to make sure the imported cards look correct.

4

Open matches, initiate the trade, and start chatting

When two users want cards from each other, CardSwap suggests a trade, lets one side initiate it, and keeps the chat right next to the trade steps.

Useful shortcut: If you already know the import flow, collapse the quick guide on the import page. CardSwap remembers that preference on the same device.
Importing cards

Three import paths, one target list

The import page is built so you can choose one method or combine a queued single-card list with a pasted deck list. All imported cards go into either your offers or your wishlist for that submit.

Single cards and staged queue

Start typing a card name, choose the exact printing, pick finish, condition, language, and quantity, then add it to the queue below. The queue is only written to your account when you submit the form.

Open the import page

Public deck URLs

You can import public Archidekt and Moxfield deck URLs. CardSwap reads the deck, turns it into import lines, and pushes those cards into the selected target list.

If a public Moxfield request is blocked, you can still export the list from Moxfield and paste it manually.

Pasted deck lists

Paste deck lines from Moxfield or Archidekt directly into the text area. This is also the best fallback when a platform URL is private or rate-limited.

Target list and replace mode

At the top of the form you choose whether the import belongs in offers or wishlist. You can append to the existing list or replace that entire list during the same import.

Bulk defaults for condition and language

Large imports usually need shortcuts. That is why the import page lets you choose a default condition and default language for the whole submit. Explicit values on a single line always win over the default.

1 Lightning Bolt (CLB) 187 *F* [LP] [DE] 1 Sol Ring (CMM) 680 1 Counterspell (2XM) 51 [NM]

In that example, the first line is foil, Lightly Played, and German. The second line inherits your chosen defaults if you set any. The third line keeps Near Mint even if the import default says something else.

Print details

Why CardSwap tracks more than just the card name

Magic trades often break down when people mean different printings. CardSwap therefore keeps the exact print visible from import through dashboard, matching, and chat.

Edition and collector number

Whenever set code and collector number are known, CardSwap treats that exact print as the real identity of the card instead of only the name.

Finish

Normal, foil, and etched are stored separately. Some variants even have their own collector number, so the exact print still stays correct if the etched version is a separate listing.

Condition

CardSwap supports Near Mint, Lightly Played, Moderately Played, Heavily Played, Damaged, or not specified. Wishlist matches only become strict when a wishlist card actually requests a condition.

Language

Language works the same way as condition. If a wishlist entry does not ask for a specific language, matching stays flexible instead of becoming needlessly strict.

Important variant rule: If two versions share the same card name but have different collector numbers, CardSwap treats them as different prints. That helps avoid unfair suggestions where a premium version gets matched against a cheaper regular version.
Dashboard

How to review larger collections

Once your lists grow, the dashboard becomes the main control surface for checking whether imports look right and for finding cards quickly.

Name search

The search field is focused on card names only. That keeps it fast and predictable when you know which card you want to find.

Pagination

Offers and wishlist each have their own pagination. That keeps both lists usable even when a user has hundreds or thousands of cards.

Metadata filters

Color, type, rarity, and frame variant filters come from cached Scryfall print metadata so the dashboard can filter locally without live price lookups.

What "Regular Frame" means

A card counts as Regular Frame when it is not tagged as extended art, borderless, showcase, or full art in the cached print metadata.

Matches

How suggestions and chat work together

CardSwap does not suggest random swaps. It first looks for reciprocal demand and then tries to find a reasonably balanced combination based on cached prices.

Reciprocal demand first

A match only starts if user A offers something user B wants and user B offers something user A wants.

Exact print when possible

If a wishlist card specifies set and collector number, matching uses that exact print. Name-only fallback is only used when a wishlist entry is less specific.

Value-aware trade groups

After both sides have candidate cards, CardSwap compares grouped values and tries to stay within a reasonable tolerance so one side does not massively overpay.

Chat beside the match

The conversation is shown next to the selected trade suggestion so users can negotiate the final details without leaving the context of the match.

Unread indicators

New incoming chat messages show up as unread badges in the navigation and on the relevant match card. Opening that trade marks those messages as read.

Good to know: Prices support the suggestion, but the exact print details are just as important. A lower-priced exact match can be better than a more expensive but wrong printing.
Trade safety

How the secure trade flow works

CardSwap now separates a raw match suggestion from the actual trade process. That keeps ratings fairer and gives users a way to report scammers even if a trade never finishes cleanly.

Step 1: Initiate trade

A match starts as a suggestion only. One trader must actively initiate the trade before the other side can accept or decline it.

Step 2: Accept or decline

The other trader can now accept or decline the exact proposed swap. This prevents drive-by ratings on trades that never really started.

If the requester changes their mind before acceptance, they can cancel the pending request and the trade returns to a normal suggestion.

Step 3: Mark shipped and received

After acceptance, each side marks their shipment and later confirms receipt. Once both sides confirm receipt, the trade is completed and the involved cards are removed from offers and fulfilled wishlist entries.

Step 4: Rate or report

Completed trades can be rated once. Problem reports open after a trade was accepted, so users can still report ghosting, no shipment, wrong cards, or misstated condition before the trade ever reaches completion.

Why this matters: A scammer can avoid a normal completion rating by never shipping. That is why CardSwap has a separate problem-report flow that opens after acceptance and does not depend on the trade reaching completed status.

Archived matches

Archived matches stay readable in the Trading Center so you can review the exact cards and chat history later, even after the active workflow is finished.

Admin review queue

Problem reports land in an admin dispute queue. That lets moderation look at the report, the match, and the user history before deciding whether the complaint should count against the account.

Prices

Where prices come from and why they are cached

CardSwap currently pulls pricing from Scryfall and stores the result in a local price cache instead of asking Scryfall on every page load.

Source of truth

The app reads print data and USD prices from Scryfall card responses. Price caching is keyed to the observed print, usually by card name, set code, and collector number.

Why cache at all?

Caching keeps the dashboard and match views fast and avoids turning every user request into an external API request. That matters a lot once collections get larger.

How refresh works

A background sync job can refresh stale prices in controlled batches. That means page loads keep reading from cache while refreshes happen separately.

Recent sets are prioritized

The refresh job can prioritize cards from the newest observed sets first, because those are often the prints users trade most actively right after release.

What this means in practice: You usually see fast cached prices in the app. New cards or stale entries are refreshed in the background so the trading experience stays responsive.
Behind the scenes

How CardSwap is built

For players who like the technical details, here is the short architecture version of what happens under the hood.

Web stack

CardSwap is a Flask app with SQLAlchemy models and Alembic migrations. The project is prepared for PostgreSQL in production and can fall back to SQLite locally.

Import adapters

Public deck URLs are turned into plain import lines first. That makes URL imports, pasted lists, and queued single-card entries flow through the same parser and batch processing steps.

Matching engine

Matching checks reciprocal demand, respects print details when available, and then compares grouped card values to avoid obviously unfair suggestions.

Translation support

The interface supports German and English through Flask-Babel so core pages, import flows, and messages can stay consistent across both languages.

Security defaults

In production, CardSwap expects a real secret key, secure cookies, and a shared rate-limit store such as Redis instead of per-process memory limits.

FAQ

Common questions

Why is a match missing?

The other user may not want that exact print, or the candidate trade may be too unbalanced to pass the value tolerance check.

Why is a price empty?

That usually means the cache entry is still pending, stale, or the exact print could not be refreshed cleanly yet. The app can still store the card even before the price is ready.

Can I import only part of a deck?

Yes. The staged single-card queue is meant for that. Add only the prints you want and submit them into offers or wishlist without importing the whole deck.

Where should I start if I am new?

Start with your wishlist, then import a few easy trade offers, and only after that go to matches. It is the quickest way to see the app working end to end.

What protects the login and signup forms from bots?

CardSwap uses request throttling on login, registration, and password-reset requests, plus hidden honeypot fields on selected forms to catch simple bots without annoying normal users.

Can I use Google instead of a password?

Yes, once Google sign-in is configured you can use the Google button on the login or registration page. Verified Google emails can create a new CardSwap account automatically or link to an existing account with the same email address.

Where can I read the rules and privacy details?

CardSwap includes dedicated terms, privacy, and legal notice pages in the footer. Read them before live trading, especially because price references, trade suggestions, and beta features can still be imperfect.